分享
 
 
 

支持数据项查找功能的树控制(CTreeCtrl)类

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

支持数据项查找功能的树控制(CTreeCtrl)类

作者:许超

下载本文示例源代码

代码运行效果图如下:

一、树控制(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;

}

四、示例程序

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

(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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有