三、让树控制支持数据项查找功能
在有些场合下用户需要在树控制中添加新的数据项。新添加的数据项可能和已有的某数据项名称重复。为避免这种情况,我们需要一个函数它能够在添加新数据项之前先检查所有的数据项,如果查到包含新添加数据项名称的数据项已存在,可以向用户提示该信息。使用递归方法来实现该函数相对简单。 下面是该函数的原型、参数及代码。 /*************************************************************** * * 名称:FindItem * * 功能:在树控制中根据数据项名称查找数据项 * * 参数:item - 要查询的数据项及其子数据项 * * strText - 要查询的数据项名称 * * 返回值:NULL - 没找到 * * (非空的HTREEITEM ) - 找到 * ***************************************************************/ HTREEITEM CTreeCtrlEx::FindItem(HTREEITEM item, CString strText) { HTREEITEM hFind; if(item == NULL) return NULL; while(item!=NULL) { if(GetItemText(item) == strText) return item; if(ItemHasChildren(item)) { item = GetChildItem(item); hFind = FindItem(item,strText); if(hFind) { return hFind; } else { item= GetNextSiblingItem(GetParentItem(item)); } } else { item = GetNextSiblingItem(item); if(item==NULL) return NULL; } } return item; } |
四、示例程序
我们创建一个对话框程序。
(1) 通过“FILE->NEW->PROJECTS->MFC AppWizard(EXE)”建立名为MyTreeCtr的 工程,在建立过程中选择基于对话框(Dialog based)的应用;
(2) 将对话框中的默认按钮控件“确定”删除,并将所有对话框属性中的Language域设置为Chinese(P.R.C.),以使应用程序支持中文;在对话框窗口中添加树控制对象(TREE CONTROL),并设置一个按钮“新建数据项”,其对应标识分别如下:
控制名称 | 标题名称 | 标识符号 | 对应成员变量或函数 | 树控制 | | IDC_MYTREE | CTreeCtrl m_ctrlTree | 按钮 | 新建数据项 | IDC_ NEWITEM
| OnNewitem() | 树控制项目 | | | HTREEITEM m_hInsertItem |
(3) 处理树控制的TVN _BEGINLABELEDIT和TVN _ENDLABELEDIT消息,CMyTreeCtrlDlg增加OnBeginlabeleditMytree和OnEndlabeleditMytree两个处理函数。 void CMyTreeCtrlDlg::OnBeginlabeleditMytree(NMHDR* pNMHDR, LRESULT* pResult) { TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; // TODO: Add your control notification handler code here m_ctrlTree.GetEditControl()->LimitText(16); *pResult = 0; } void CMyTreeCtrlDlg::OnEndlabeleditMytree(NMHDR* pNMHDR, LRESULT* pResult) { TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; // TODO: Add your control notification handler code here CString strName; m_ctrlTree.GetEditControl()->GetWindowText(strName); if(strName.IsEmpty()) { AfxMessageBox(_T("数据项名称不能为空,请重新输入!")); CEdit* pEdit = m_ctrlTree.EditLabel(m_hInsertItem); ASSERT(pEdit != NULL); return; } HTREEITEM hRoot = m_ctrlTree.GetRootItem(); HTREEITEM hFind = m_ctrlTree.FindItem(hRoot,strName); if(hFind==NULL) { char msg[64]={0}; sprintf(msg,"新添加数据项名称 %s ,确定吗?",strName); if(MessageBox(msg,_T("提示"),MB_OKCANCEL) == IDOK) *pResult = TRUE; else m_ctrlTree.DeleteItem(m_hInsertItem); } else { AfxMessageBox(_T("该数据项已存在,请重新输入!")); CEdit* pEdit = m_ctrlTree.EditLabel(m_hInsertItem); ASSERT(pEdit != NULL); *pResult = 0; } } |
五、结束语
CTreeCtrlEx类的FindItem函数实现数据项查找的功能。测试程序在Win98+VC6.0环境下测试通过。  
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |