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

2016-02-19 12:59 37 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是支持数据项查找功能的CTreeCtrl类,一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】

  一、树控制(CTree Control)

  树控制用于显示具有一定层次结构的数据项。很多应用程序都使用该控件,例如资源管理器中的磁盘目录等。

  树控制中有根数据项(root item),根数据项下包含各个子数据项(child item)。根数据项是所有子数据项的父亲,而这些子数据项是根数据项的孩子。所有子数据项互为兄妹(sibling)关系。每个数据项包括数据项名称(文本字符串)和用于表示该数据项的图像,每个数据项下还可以包含子项,整个结构就象一棵树。

  二、使用树控制

  在MFC中,树控制被封装成CTreeCtrl类。下面我们谈谈树控制的创建、&&属性和操作方法。

  (1) 树控制的创建

  树控制一般用于对话框程序。创建树控制有两种方法,一种是静态创建,一种是动态创建。静态创建是指拖放控件后声明与之相关的成员变量来操作树控制。在对话框程序界面上拖放一个CTreeCtrl控件,然后通过ClassWizard添加一个CTreeCtrl类型的成员变量并在程序中使用它。动态创建是指在程序中使用Create&&函数创建树控制对象。本文例子采用静态创建的方法。

  (2) 树控制的&&属性

  树控制有很多&&属性操作&&函数。使用这些&&函数可以得到树控制的各种&&属性信息。例如:取得树控制中项数GetCount、取得树控制中项相对于父项的偏移值GetIndent、取得树控制图像列表控制句柄GetImageList等。具体信息可以查看MSDN帮助。

  (3) 数控制的操作

  树控制的操作方法包括插入一个树项InsertItem、删除一个树项DeleteItem、删除所有树项DeleteAllItems、展开或合拢树项的子项Expand、选中特定树项SelectItem、选择一个树项作为第一个可视树项SelectSetFirstVisible、编辑一个可视的树项EditLabel和排序给定父树项的子树项SortChildren等。

  三、让树控制支持数据项查找功能

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

/***************************************************************
*
* 名称: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;

 
  四、示例程序

  我们创建一个对话框程序。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  (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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)


  (3) 处理树控制的TVN _BEGINLABELEDIT和TVN _ENDLABELEDIT消息,CMyTreeCtrlDlg增加OnBeginlabeleditMytree和OnEndlabeleditMytree两个处理&&函数。

void CMyTreeCtrlDlg::OnBeginlabeleditMytree(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TOD 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;
// TOD 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环境下测试通过。

来源:http://www.tulaoshi.com/n/20160219/1602695.html

延伸阅读
关闭查找我的iPhone功能   查找我的iPhone是非常实用的一款手机应用软件,能够在地图上定位你iPhone的位置,还能远程发送消息、远程锁定或者远程擦除iPhone里面的资料信息,还能够远程发送声音到iPhone上面,在家里或者办公(图老师整理)室如果是忘了把iPhone放在哪里了,让iPhone播放声音这有利于帮忙找回iPhone,如果丢了iPhone即使...
Excel怎么查找重复项 不同版本的Excel操作方式略有不同,但大同小异,下面以Excel2007为例。 1.打开需要编辑的Excel表格。观察表格发现有部分数据相同,需要将这些重复的数据用醒目的颜色标注出。首先,选中需要查找重复值的一列或某个区域。 2.鼠标单击开始菜单,依次选择样式-条件格式-突出显示单元格规则-重复值。 3.弹出重复值对话框,...
如何使用查找iPhone功能?   问:如何使用查找iPhone功能? 答:查找我的iPhone是iCloud云服务的其中一项,可以帮助用户快速定位丢失的手机。使用该功能之前,必须满足几个条件:1)手机是丢失而非被盗;2)能够www.tulaoshi.com正常连接网络;3)设置功能下的iCloud菜单中已经开启了查找我的iPhone功能。如果以上三个条件均能满足...
比较数据排序前后的查找次数 作者:宋科 作者主页:kesongemini.diy.163.com 下载本文源代码 题目: 随机产生 1000 个 1-2000 以内的互不相同的整数, 1)存储于一个数组中(不排序) 2)存储于一个数组中(排序) 分别应用查找运算,要求输入一个...
标签: 电脑应用
Word查找替换不仅可以帮助我们快速的定位到想要的内容,还可以让我们批量修改文章中相应的内容。 有很多人只知道“查找替换”功能可以批量修改文字,不仅仅是这样,今天Word联盟所要讲的是查找替换所有的使用功能大全,各种各样的用法,为的就是能在以后的处理文档时更加方便,希望大家可以灵活运用,即学即用。 一、最基...

经验教程

85

收藏

5
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部