科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件支持数据项查找功能的CTreeCtrl类

支持数据项查找功能的CTreeCtrl类

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

树控制用于显示具有一定层次结构的数据项。很多应用程序都使用该控件......

作者:许超 来源:天极论坛 2007年10月22日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
三、让树控制支持数据项查找功能

  在有些场合下用户需要在树控制中添加新的数据项。新添加的数据项可能和已有的某数据项名称重复。为避免这种情况,我们需要一个函数它能够在添加新数据项之前先检查所有的数据项,如果查到包含新添加数据项名称的数据项已存在,可以向用户提示该信息。使用递归方法来实现该函数相对简单。
下面是该函数的原型、参数及代码。

/***************************************************************
*
* 名称: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环境下测试通过。有何问题请来信:landofdreams@bj1860.net

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章