软件中数据查找

本文介绍了在软件开发中实现数据即时查找功能的步骤,包括新建列表单文档应用程序、初始化列表、添加查找对话框窗口及其类、在主框架中添加查找事件以及在视图中高亮显示查找到的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在软件开发中,数据的查找功能是我们经常会用到的。本篇主要讲输入信息立即查找功能的实现。

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;
}

效果

   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值