在软件开发中,数据的查找功能是我们经常会用到的。本篇主要讲输入信息立即查找功能的实现。
1.新建列表单文档应用程序
class CFindTextDemoView : public CListView
2.初始化列表
public:
void MyInitialUpdate();
void CFindTextDemoView::MyInitialUpdate()
{
CListCtrl& list = GetListCtrl();
list.ModifyStyle(LVS_TYPEMASK,LVS_REPORT & LVS_TYPEMASK | LVS_SINGLESEL);//important for show
DWORD dwStyle = list.GetExtendedStyle();
list.SetExtendedStyle(dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
CImageList image;
image.Create(1,30,ILC_COLOR24 | ILC_MASK,4,0);
list.SetImageList(&image,LVSIL_SMALL);
CFont font;
font.CreateFont(
22,
0,
0,
0,
FW_NORMAL,
FALSE,
FALSE,
0,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS,
_T("宋体"));
list.SetFont(&font);
list.GetHeaderCtrl()->SetFont(&font);
//标题栏
list.InsertColumn(0,"序号",LVCFMT_LEFT,80,0);
list.InsertColumn(1,"姓名",LVCFMT_LEFT,120,0);
list.InsertColumn(2,"年龄",LVCFMT_LEFT,80,0);
//设置内容
list.InsertItem(0,"001");
list.SetItemText(0,1,"小明");
list.SetItemText(0,2,"18");
list.InsertItem(1,"002");
list.SetItemText(1,1,"小红");
list.SetItemText(1,2,"17");
list.InsertItem(2,"003");
list.SetItemText(2,1,"小华");
list.SetItemText(2,2,"19");
}
3.添加查找对话框窗口和相应的类
类派生于CDialogBar,如果在添加类的时候没有,先使用CDialog,然后手动修改为CDialogBar。
然后添加相应的变量和成员函数。
#pragma once
// CDialogToolBar 对话框
class CDialogToolBar : public CDialogBar
{
DECLARE_DYNAMIC(CDialogToolBar)
public:
CDialogToolBar(CWnd* pParent = NULL); // 标准构造函数
virtual ~CDialogToolBar();
// 对话框数据
enum { IDD = IDD_DIALOG_TOOL_BAR };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CString m_sFindText;
CString GetFindText();
};
// DialogToolBar.cpp : 实现文件
//
#include "stdafx.h"
#include "FindTextDemo.h"
#include "DialogToolBar.h"
// CDialogToolBar 对话框
IMPLEMENT_DYNAMIC(CDialogToolBar, CDialogBar)
CDialogToolBar::CDialogToolBar(CWnd* pParent /*=NULL*/)
{
m_sFindText = _T("");
}
CDialogToolBar::~CDialogToolBar()
{
}
void CDialogToolBar::DoDataExchange(CDataExchange* pDX)
{
CDialogBar::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_FIND, m_sFindText);
}
BEGIN_MESSAGE_MAP(CDialogToolBar, CDialogBar)
END_MESSAGE_MAP()
// CDialogToolBar 消息处理程序
CString CDialogToolBar::GetFindText()
{
UpdateData(TRUE);
return m_sFindText;
}
4.在MainFrm中添加查找对话框窗口和相应的点击事件
public:
int CreateToolBar();
CDialogToolBar m_DialogToolBar;
afx_msg void OnEnChangeEditFind();
int CMainFrame::CreateToolBar()//在OnCreate(LPCREATESTRUCT lpCreateStruct)函数中添加
{
//查找
if (!m_DialogToolBar.Create(this, IDD_DIALOG_TOOL_BAR, CBRS_ALIGN_TOP, IDD_DIALOG_TOOL_BAR))
{
TRACE0("Failed to create dialogbar\n");
return -1; // fail to create
}
EnableDocking(CBRS_ALIGN_ANY);
m_DialogToolBar.EnableDocking(CBRS_ALIGN_TOP);
DockControlBar(&m_DialogToolBar,AFX_IDW_DOCKBAR_TOP);
m_DialogToolBar.ShowWindow(SW_SHOW);
return 0;
}
void CMainFrame::OnEnChangeEditFind()
{
// TODO: 如果该控件是 RICHEDIT 控件,则它将不会
// 发送该通知,除非重写 CFrameWnd::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
CMainFrame *pMain=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CFindTextDemoView *pView=(CFindTextDemoView*)pMain->GetActiveView();
if (pView)
{
pView->FindText(m_DialogToolBar.GetFindText());
}
}
5.在View中查找并用醒目的颜色标识出来
public:
void MyConstruct();//构造函数
CWordArray m_arrSelectItem;
CString m_sFindText;
void FindText(CString sText);
afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
void CFindTextDemoView::MyConstruct()
{
m_sFindText = "";
m_arrSelectItem.RemoveAll();
}
void CFindTextDemoView::FindText(CString sText)
{
CString sSubItemText = "";
m_arrSelectItem.RemoveAll();
if(sText.IsEmpty())
{}
else
{
m_sFindText = sText;
sText.MakeLower();
CListCtrl &list = (CListCtrl&)GetListCtrl();
int cnt = list.GetItemCount();
for(int i=0;i<cnt;i++)
{
for(int j=0; j<3; j++)
{
sSubItemText = list.GetItemText(i,j);
sSubItemText.MakeLower();
if(-1 != sSubItemText.Find(sText))
{
m_arrSelectItem.Add(i);
}
}
}
}
Invalidate();
}
void CFindTextDemoView::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
int iRow = lplvcd->nmcd.dwItemSpec;
switch(lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT :
{
*pResult = CDRF_NOTIFYITEMDRAW;
return;
}
// Modify item text and or background
case CDDS_ITEMPREPAINT:
{
lplvcd->clrText = RGB(0,0,0);
// If you want the sub items the same as the item,
// set *pResult to CDRF_NEWFONT
*pResult = CDRF_NOTIFYSUBITEMDRAW;
return;
}
// Modify sub item text and/or background
case CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM:
{
bool bFind = false;
int cnt = m_arrSelectItem.GetSize();
for(int i=0;i<cnt;i++)
{
if(iRow == m_arrSelectItem[i])
{
bFind = true;
break;
}
}
if(bFind)
{
lplvcd->clrText = RGB(255,0,0);
}
*pResult = CDRF_DODEFAULT;
return;
}
}
*pResult = 0;
}