VCMFC中TREE树控件的使用
C#Winform中treeView控件使用总结

C#Winform中treeView控件使⽤总结1.如何展开结点时改变图标(注意:不是选中时)要在⽬录中使⽤图标⾸先要加⼊⼀个控件ImageList(命名为imageList1),然后可以按图⽚的index或名称引⽤图⽚.然后需要在TreeView控件的ImageList属性中指向imageList1.TreeView有两个属性:SelectImageIndex:选中该结点时显⽰的图⽚的索引ImageIndex:未选中该结点时显⽰的图⽚的索引可以实现的效果是,选中某个结点时该结点的图⽚进⾏改变,如果我们的⽬标也是如此,万事已经⼤吉了.但我希望的效果是:展开某个结点时该结点的图⽚改变(如显⽰为打开的盒⼦),折叠时该结点的图⽚改变(如包装好的盒⼦).直接使⽤属性⽆法实现该效果.实现原理是:展开某个结点时将SelectImageIndex和ImageIndex统统指向打开盒⼦的图⽚折叠某个结点时将SelectImageIndex和ImageIndex统统指向包装盒⼦的图⽚⾃然需要⽤到两个事件:TreeView的AfterExpand和AfterCollapse事件private void treeView1_AfterExpand(object sender, TreeViewEventArgs e){e.Node.ImageIndex = 1; //指向展开的图标e.Node.SelectedImageIndex = 1;//指向展开的图标}private void treeView1_AfterCollapse(object sender, TreeViewEventArgs e){e.Node.ImageIndex = 0; //指向关闭的图标e.Node.SelectedImageIndex = 0;//指向关闭的图标}PS:当对某个结点的属性ImageIndex和SelectedImageIndex赋值后,向它添加的⼦结点如未指定该属性,似乎会沿⽤⽗结点的属性,所以通常我会对⼦结点单独设置该值 .2.重命名结点名称重命名结点的功能很好实现,只要将TreeView的LabelEdit属性改为True即可.选中某个结点后再单击(提⽰:间隔短的话算做双击),然后结点名称变成可以编辑状态,修改⽂本后即可完成.但我的程序设计是这样的:结点的名称会在后⾯⾃动加⼊⼦结点的数量(注:树的深度为2).效果如图:这样就会带来⿇烦(我们总是擅长给⾃⼰制造⿇烦?),因为我在重命名的时候并不想在编辑状态下名称中包含后⾯数字(它只在显⽰的时候出现).假设我希望将"新建分组"重命名为"我的分组",我希望进⼊编辑状态时,名称为"新建分组",修改后的名称为"我的分组",退出编辑状态时显⽰为"我的分组[1]".那实际的逻辑就是这样:1.进⼊编辑状态时将名称的数字去掉2.退出编辑状态时将名称加⼊数字.so easy!那如何获取进⼊编辑状态时的事件呢?我没有找到,或者可能就没有,但我们可以在结点的单击事件中进⾏捕获,再判断结点的⽂本是否为选中状态private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e){if (e.Node.IsSelected){e.Node.Text = "替换掉数字,请⾃⼰实现";}}然后捕捉编辑结束事件,实现加数字的⽅法private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e){if (!e.CancelEdit){ e.Node.Text=bel+string.Format(" [{0}]", e.Node.Nodes.Count.ToString()); e.CancelEdit = true; //注意这⾥ } }以下是重点:在上⾯的代码没加⼊ e.CancelEdit = true 之前,会有⼀个奇怪的现象,当我将结点的名称修改后不会出现后⾯的数字.假设我修改的顺序是这样:将A->B->B很有趣的现象:当从A变成B时后⾯的数字不会出现,当从B变成B时(实际没有发⾏变动),数字⼜出现了.跟踪了很久的程序加上了很长的时间分析,终于明⽩原因了.当我们修改结点的⽂本时是这样的⼀个顺序:结点进⼊编辑状态->触发BeforeLabelEdit事件->触发AterLabelEdit事件->刷新界⾯⽤新值代替旧值.在 treeView1_AfterLabelEdit事件的参数中有两个属性:bel 修改之后的值(新值,可能为null,只读) 和s.Node.Text 修改之前的值(旧值,可读写).仔细分析后可以理解上⾯的现象:当从A->修改为B时,我们的代码对e.Node.Text(旧值)进⾏了赋值加⼊数字,最后程序刷新界⾯时会⽤新值代替旧值.这时我们加⼊的数字被新值Label覆盖了(代码做了⽆⽤功)⽽我们从B->修改为B时,由于新值(Label)为null,则系统不会执⾏最后⼀步,所以我们添加的数字得到了保留.最终的做法,就是将参数的e.CancelEdit改为true,告诉系统我们就当我们没有编辑过吧.这样系统就不会执⾏最后⼀步了,我们代码的修改得到了保留.。
树控件(TREECTRL)的使用

树控件(TREECTRL)的使用通过“FILE->NEW->PROJECTS->MFC AppWizard(EXE)”建立名为VCTREE的工程,在建立过程中选择基于对话框(Dialog based)的应用;将对话框中的默认控件删除,并将所有对话框属性中的Language域设置为Chinese(P.R.C.),以使应用程序支持中文;建立两个图标IDI_PM和IDI_CJ,用来表示图标的选中和非选中状态,对于每个图标都应建立32X32和16X16两种大小,以保证程序的需要;在对话框窗口中添加树控制对象(TREE CONTROL),并设置五个按钮“增加|删除|查看|排序|关闭”,其对应标识分别如下:控制名称标题名称标识符号树控制IDC_TREECTRL按钮增加IDC_ADD删除IDC_DEL查看IDC_VIEW排序IDC_SORT关闭IDOK选中树控制控件,选择“VIEW->ClassWizard->Memory Variables。
IDC_TREECTRL 引入成员变量,其变量类型为:变量名种类变量类型m_TreeCtrl Control C TreeCtrl同时利用“MESSAGES MAP”为各命令按钮增加控制功能函数。
然后在代码文件VCTREEDlg.CPP中分别加入如下控制代码:(1)在文件开始处增加图像列表定义CImageList Cil1,Cil2;//大小图标像列表(2)在初始化文件开始处增加代码BOOL CVCTREEDlg::OnInitDialog(){ CDialog::OnInitDialog();......//原来其它代码// TODO: Add extra initialization here// 此处开始增加代码Cil1.Create(16,16,ILC_COLOR,2,2);Cil1.Add(AfxGetApp()->LoadIcon(IDI_PM));Cil1.Add(AfxGetApp()->LoadIcon(IDI_CJ));m_TreeCtrl.SetImageList(&Cil1,TVSIL_NORMAL); file://设置图象列表DWORDdwStyles=GetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE);//获取树控制原风格dwStyles|=TVS_EDITLABELS|TVS_HASBUTTONS|TVS_HASLINES|TVS_L INESATROOT;SetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE,dwStyles);//设置风格wchar_t * CJ[4]={L"玉溪卷烟厂",L"云南卷烟厂",L"沈阳卷烟厂",L"成都卷烟厂"};//根数据名称wchar_t * PM[4][5]={{L"红梅一",L"红梅二",L"红梅三",L"红梅四",L"红梅五"},//产品数据项{L"白梅一",L"白梅二",L"白梅三",L"白梅四",L"白梅五"},{L"绿梅一",L"绿梅二",L"绿梅三",L"绿梅四",L"绿梅五"},{L"青梅一",L"青梅二",L"青梅三",L"青梅四",L"青梅五"}};int i,j;HTREEITEM hRoot,hCur;//树控制项目句柄TV_INSERTSTRUCT TCItem;//插入数据项数据结构TCItem.hParent=TVI_ROOT;//增加根项TCItem.hInsertAfter=TVI_LAST;//在最后项之后TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELE CTEDIMAGE;//设屏蔽TCItem.item.pszText="数据选择";TCItem.item.lParam=0;//序号TCItem.item.iImage=0;//正常图标TCItem.item.iSelectedImage=1;//选中时图标hRoot=m_TreeCtrl.InsertItem(&TCItem);//返回根项句柄for(i=0;i<4;i++){//增加各厂家TCItem.hParent=hRoot;TCItem.item.pszText=CJ[i];TCItem.item.lParam=(i+1)*10;//子项序号hCur=m_TreeCtrl.InsertItem(&TCItem);for(j=0;j<5;j++){//增加各产品TCItem.hParent=hCur;TCItem.item.pszText=PM[i][j];TCItem.item.lParam=(i+1)*10+(j+1);//子项序号m_TreeCtrl.InsertItem(&TCItem);}m_TreeCtrl.Expand(hCur,TVE_EXPAND);//展开树}m_TreeCtrl.Expand(hRoot,TVE_EXPAND);//展开上一级树return TRUE; // return TRUE unless you set the focus to a control}(3)增加树项功能的实现在增加树项功能时,除了需要定义和设置插入树项的数据结构之外,还需要注意的是新增树项的名称初始时均为“新增数据”,增加后允许用户给数据项设置自定义名称。
树控件TREECTRL的使用

树控件(TREECTRL)的使用通过“FILE->NEW->PROJECTS->MFC AppWizard(EXE)”建立名为VCTREE的工程,在建立过程中选择基于对话框(Dialog based)的应用;将对话框中的默认控件删除,并将所有对话框属性中的Language域设置为Chinese(P.R.C.),以使应用程序支持中文;建立两个图标IDI_PM和IDI_CJ,用来表示图标的选中和非选中状态,对于每个图标都应建立32X32和16X16两种大小,以保证程序的需要;在对话框窗口中添加树控制对象(TREE CONTROL),并设置五个按钮“增加|删除|查看|排序|关闭”,其对应标识分别如下:控制名称标题名称标识符号树控制IDC_TREECTRL按钮增加IDC_ADD删除IDC_DEL查看IDC_VIEW排序IDC_SORT关闭IDOK选中树控制控件,选择“VIEW->ClassWizard->Memory Variables。
IDC_TREECTRL 引入成员变量,其变量类型为:变量名种类变量类型m_TreeCtrl Control C TreeCtrl同时利用“MESSAGES MAP”为各命令按钮增加控制功能函数。
然后在代码文件VCTREEDlg.CPP中分别加入如下控制代码:(1)在文件开始处增加图像列表定义CImageList Cil1,Cil2;//大小图标像列表(2)在初始化文件开始处增加代码BOOL CVCTREEDlg::OnInitDialog(){ CDialog::OnInitDialog();......//原来其它代码// TODO: Add extra initialization here// 此处开始增加代码Cil1.Create(16,16,ILC_COLOR,2,2);Cil1.Add(AfxGetApp()->LoadIcon(IDI_PM));Cil1.Add(AfxGetApp()->LoadIcon(IDI_CJ));m_TreeCtrl.SetImageList(&Cil1,TVSIL_NORMAL); file://设置图象列表DWORDdwStyles=GetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE);//获取树控制原风格dwStyles|=TVS_EDITLABELS|TVS_HASBUTTONS|TVS_HASLINES|TVS_L INESATROOT;SetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE,dwStyles);//设置风格wchar_t * CJ[4]={L"玉溪卷烟厂",L"云南卷烟厂",L"沈阳卷烟厂",L"成都卷烟厂"};//根数据名称wchar_t * PM[4][5]={{L"红梅一",L"红梅二",L"红梅三",L"红梅四",L"红梅五"},//产品数据项{L"白梅一",L"白梅二",L"白梅三",L"白梅四",L"白梅五"},{L"绿梅一",L"绿梅二",L"绿梅三",L"绿梅四",L"绿梅五"},{L"青梅一",L"青梅二",L"青梅三",L"青梅四",L"青梅五"}};int i,j;HTREEITEM hRoot,hCur;//树控制项目句柄TV_INSERTSTRUCT TCItem;//插入数据项数据结构TCItem.hParent=TVI_ROOT;//增加根项TCItem.hInsertAfter=TVI_LAST;//在最后项之后TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELE CTEDIMAGE;//设屏蔽TCItem.item.pszText="数据选择";TCItem.item.lParam=0;//序号TCItem.item.iImage=0;//正常图标TCItem.item.iSelectedImage=1;//选中时图标hRoot=m_TreeCtrl.InsertItem(&TCItem);//返回根项句柄for(i=0;i<4;i++){//增加各厂家TCItem.hParent=hRoot;TCItem.item.pszText=CJ[i];TCItem.item.lParam=(i+1)*10;//子项序号hCur=m_TreeCtrl.InsertItem(&TCItem);for(j=0;j<5;j++){//增加各产品TCItem.hParent=hCur;TCItem.item.pszText=PM[i][j];TCItem.item.lParam=(i+1)*10+(j+1);//子项序号m_TreeCtrl.InsertItem(&TCItem);}m_TreeCtrl.Expand(hCur,TVE_EXPAND);//展开树}m_TreeCtrl.Expand(hRoot,TVE_EXPAND);//展开上一级树return TRUE; // return TRUE unless you set the focus to a control}(3)增加树项功能的实现在增加树项功能时,除了需要定义和设置插入树项的数据结构之外,还需要注意的是新增树项的名称初始时均为“新增数据”,增加后允许用户给数据项设置自定义名称。
WinForm树控件开发说明书

属性、#endregion 属性"标识,以增强代码可读性; � 附录 1 :XML 树数据
XSD 定义
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="Tree"> <xs:complexType> <xs:sequence> <xs:element name="Node" type="NodeType"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="NodeType"> <xs:sequence> <xs:element ref="Node"/> </xs:sequence> <xs:attribute name="ID" type="xs:int"/> <xs:attribute name="Text" type="xs:string"/> <xs:attribute name="NodeType" type="xs:string"/> <xs:attribute name="Tag" type="xs:any"/> <xs:attribute name="Tip" type="xs:string"/> <xs:attribute name="RefID" type="xs:int"/> <xs:attribute name="RalationDataID" type="xs:int"/> <xs:attribute name="RalationID" type="xs:int"/> </xs:complexType> </xs:schema> Xml 示例:
MFC控件:树形控件(CTreeCtrl)

MFC控件:树形控件(CTreeCtrl)树形控件划分: 根节点:所有都收缩后的节点 节点:能展开 叶: 不能展开 说明: 节点和叶不是绝对的划分,当在对叶添加新下属后,该叶变为节点树形控件操作逻辑:1、创建控件 CTreeCtrl类的Create成员函数的原型如下:virtual BOOL Create(DWORD dwStyle, //控件风格const RECT& rect, //控件窗⼝的位置和⼤⼩CWnd* pParentWnd, //控件⽗窗⼝的指针UINT nID //控件的ID); 控件的主要风格以及含义。
TVS_DISABLEDRAGDROP:禁⽌树形控件发送TVN_BEGINDRAG通知消息,即不⽀持拖动操作;TVS_EDITLABELS:⽤户可以编辑节点的标签⽂本;TVS_HASBUTTONS:显⽰带有"+"或"-"的⼩⽅框来表⽰某项能否被展开或已展开;TVS_HASLINES:在⽗节点与⼦节点间连线以更清晰地显⽰树的结构;TVS_LINESATROOT:在根节点处连线;TVS_SHOWSELALWAYS:即使控件失去输⼊焦点,仍显⽰出项的选择状态;同样,动态创建树形控件时,除了能够指定上述风格的组合外,⼀般还要指定WS_CHILD和WS_VISIBLE风格。
2.添加图标类3.添加节点4.消息响应函数树形控件添加: 节点结构体: HTREEITEM ,⽤该结构体声明节点变量 为控件添加项: HTREEITEM InsertItem(LPCTSTR lpszItem, //项名int nImage, //树视图控件图像列表中的项的图像的索引int nSelectedImage, //树视图控件图像列表中的项的所选图像的索引HTREEITEM hParent = TVI_ROOT, //插⼊的项的⽗级的句柄HTREEITEM hInsertAfter = TVI_LAST //新的项之前要插⼊的项的句柄);注:添加项之前先设定根节点,在初始化树形控件⿏标点击: 判断⿏标位置HTREEITEM CMyTreeDlg::GetSelectTree(){CPoint pt;GetCursorPos(&pt);//得到当前⿏标的位置m_MyTree.ScreenToClient(&pt);//将屏幕坐标转换为客户区坐标HTREEITEM tree_Item = m_MyTree.HitTest(pt);//调⽤HitTest找到对应点击的树节点return tree_Item; //返回⿏标位置节点} 获取某项⽂本 CString GetItemText(HTREEITEM hItem) const; 获取指定关系项 HTREEITEM GetNextItem( HTREEITEM hItem, UINT nCode) const; nCode标志可以是下列值之⼀︰TVGN_CARET检索当前所选的项。
mfc tree control用法

mfc tree control用法MFC(Microsoft Foundation Classes)是微软提供的一组C++类库,用于快速开发Windows桌面应用程序。
MFC提供了许多控件类,其中包括Tree Control (树控件),用于展示树形结构的数据。
下面是一个基本的MFC Tree Control的用法示例:1. 在对话框资源中添加一个Tree Control控件,并为它分配一个ID。
2. 在对话框类的头文件中添加一个成员变量来引用Tree Control控件,如CTreeCtrl m_treeCtrl。
3. 在OnInitDialog()函数中获取Tree Control控件的指针,并进行初始化设置。
示例代码如下:```cppBOOL CMyDialog::OnInitDialog(){CDialog::OnInitDialog();// 获取Tree Control控件指针CTreeCtrl* pTreeCtrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);// 设置根节点HTREEITEM hRootItem = pTreeCtrl->InsertItem(TEXT("Root"));// 添加子节点HTREEITEM hChildItem1 = pTreeCtrl->InsertItem(TEXT("Child 1"), hRootItem);HTREEITEM hChildItem2 = pTreeCtrl->InsertItem(TEXT("Child 2"), hRootItem);// 展开根节点pTreeCtrl->Expand(hRootItem, TVE_EXPAND);return TRUE;}```4. 可以通过使用CTreeCtrl类提供的方法来进行其他操作,例如添加节点、删除节点、获取节点信息、设置节点图标等。
vc中给树形控件的图标加上工具提示

VC中给树形控件的图标加上工具提示我从没有在任何一个应用程序中看到过图标的工具提示。
有时候查遍了整个帮助文档也没有明白某个图标是什么意思。
如果能在自己的程序中为图标加上工具提示,一定会使界面的友好性大大增加。
本文中以树形控件为例,详细介绍了在VC中使用MFC提供的机制来实现图标工具提示的方法。
---- 第一步:使控件可以显示工具提示---- 调用EnableToolTips(TRUE)使一个窗口可以显示工具提示。
在什么地方插入这条代码最好呢?在类的PreSubclassWindow()中。
因为不管一个控件如何被创建,MFC都会调用此函数。
而其他的函数则不一定会被调用。
以OnCreate()为例,如果调用Create()或CreateEx()创建一个控件,OnCreate()会被调用,而如果一个控件是从对话框资源创建,OnCreate()就不会被调用。
实现代码如下:void CTreeCtrlX::PreSubclassWindow(){CTreeCtrl::PreSubclassWindow();EnableToolTips(TRUE);}---- 第二步:重载虚函数OnToolHitTest()---- MFC调用函数来确定在某个点是否应该显示工具提示。
MSDN建议如果鼠标落在应该显示工具提示的点上,返回值1。
这并不完全正确。
这个函数应该返回不同的值来区分窗口中不同的应该显示提示的区域。
---- 在这个函数中,本文只处理鼠标落在节点图标或节点状态图标上的情况。
读者可以按照自己的情况向树的其他元素上添加工具提示。
在两种情况下,都要计算图标的区域,并且把TOOLINFO的uID设为鼠标所在点的树节点的句柄。
注意,尽管对于节点图标和节点状态图标,使用了相同的id,但返回值并不相同。
不同的返回值迫使MFC更新工具提示。
---- 虽然我们可以在此函数中给出工具提示,但因为鼠标的每次移动都会调用此函数,太多的处理并不是一个好注意,所以我们在其他的函数中处理应该显示什么提示的问题。
mfc tree control 高级用法

mfc tree control 高级用法MFC Tree Control的高级用法MFC Tree Control是Microsoft Foundation Classes(MFC)中的一个重要控件,用于在Windows应用程序中显示树状结构的数据。
除了基本的显示和展开折叠功能外,MFC Tree Control还提供一些高级用法,以增强用户体验和数据展示的灵活性。
一、自定义绘制节点MFC Tree Control允许开发人员自定义绘制每个节点的外观。
通过覆盖基类的虚拟函数,可以在绘制节点时进行自定义操作。
例如,你可以更改节点的背景色、文字颜色,甚至绘制自定义图标来表示不同的节点类型。
二、节点排序MFC Tree Control的默认行为是按照添加节点的顺序来显示它们。
但是,如果你希望有特定的节点排序规则,你可以通过重写比较函数来实现。
通过在节点比较函数中定义自己的排序逻辑,你可以按照节点值、节点类型或其他自定义标准对节点进行排序。
三、拖放支持MFC Tree Control还提供了拖放支持,使用户能够方便地重新组织树状结构。
你可以将节点拖动到其他节点之间,甚至移动节点到不同的树控件中。
通过处理拖放事件,你可以自定义节点移动的规则和行为。
四、节点编辑MFC Tree Control允许用户在展示的树状结构中编辑节点的文本。
通过启用节点编辑功能,用户可以直接在节点上双击并修改文本。
你可以在编辑结束后响应事件,并根据用户的修改来更新数据。
总结:MFC Tree Control提供了许多高级用法来增强树状结构数据的展示效果和用户交互体验。
自定义绘制节点、节点排序、拖放支持和节点编辑功能都为开发人员提供了灵活的方式来定制树控件。
通过充分利用这些高级用法,你可以创建出功能强大且用户友好的树状数据展示组件。
MFC树控件入门实例讲解

MFC树控件的简单入门本文简单介绍了有关MFC中树形控件的最基本的用法,鉴于水平有限,仅希望能够读者通过简单的编程实例,起到对树形控件入门之目的。
因为笔者对MFC知识点的学习也都是从实例中学习,这样效率会相对较高,好了不说废话了,开始…1.新建一名为“MyTree”的对话框(Dialog based)应用程序项目(MFCAppWizard(EXE)),编译完成后效果如下:图12.删除对话框中的静态文本控件,并添加Tree Contrl控件和三个Button控件,各控件属性见下表,完成效果如下:表1图23.在对话框中的树型控件上右键添加CTreeCtrl类的变量m_treeCtrl,此时在类视图中的CMyTreeDlg类中增加了私有变量m_treeCtrl。
4.在初始化按钮上双击,在其初始化处理函数内添加一些代码,完成初始化工作,初始化工作主要实现树型控件内各个节点的添加工作,此时先在MSDN中找到CTreeCtrl类的(member)成员,依次参考Create/等成员函数,可参考下面代码:void CMyTreeDlg::OnBnClickedBtnInitial(){//添加根节点HTREEITEM root= m_treeCtrl.InsertItem(_T("root"));//添加两个父节点HTREEITEM parent1 = m_treeCtrl.InsertItem(_T("parent1"));HTREEITEM parent2 = m_treeCtrl.InsertItem(_T("parent2"));//为父节点添加子节点,child2在child1之后HTREEITEM child1 = m_treeCtrl.InsertItem(_T("child1"),parent1); HTREEITEM child2 = m_treeCtrl.InsertItem(_T("child2"),parent1,child1); HTREEITEM child3 = m_treeCtrl.InsertItem(_T("child3"),parent1,child2);HTREEITEM child11 = m_treeCtrl.InsertItem(_T("child11"),parent2); HTREEITEM child22 = m_treeCtrl.InsertItem(_T("child22"),parent2,child11); HTREEITEM child33 = m_treeCtrl.InsertItem(_T("child33"),parent2,child22);}5.此时运行程序,多次点击初始化出现以下界面:图3此时我们发现两处不足(bug): 一是每次点击初始化按钮就出现一个树结构,实际上我们需要的是一组树结构,不应该重复相同的树结构;二是图中显示的树结构,父节点与子节点之间没有连线,看起来不直观,需要修改树控件的类型(style)。
vc树控件Tree

vc树控件Tree Control 的简单使⽤⼀。
在对话框上有:1。
⼀个Tree Control,为其增加变量m_treeCtrl,和选择函数OnSelchangedTree1 。
2。
⼀个 Edit Box ,⽤于输⼊树的节点名称。
3。
四个Button,分别为增加,编辑,删除,和设置到⼀级以便再次增加⼀级节点。
⼆。
主要代码如下:(略加修改⽹络代码)int m_firstFlag=1;//设置为第⼀级void CTreeCtrlDlg::OnBUTTONAdd(){CString strText;GetDlgItemText(IDC_EDIT_Text, strText); //⽤户的输⼊if(strText.GetLength() == 0){AfxMessageBox(_T("请输⼊⽂本!"));return ;}HTREEITEM hItem = m_treeCtrl.GetSelectedItem();//当前所选节点//如果当前没有选中节点,或者设置为⼀级节点,则添加根节点if(hItem== NULL || m_firstFlag==1){m_firstFlag=0;hItem = TVI_ROOT;}TVINSERTSTRUCT ts = {0}; //节点数据ts.hParent = hItem; //新节点的⽗节点ts.hInsertAfter = TVI_LAST; //加在同级节点最后ts.item.pszText = (LPTSTR)(LPCTSTR)strText; //新节点的⽂本ts.item.mask = TVIF_TEXT;//让⽂本成员有效HTREEITEM hNewItem = m_treeCtrl.InsertItem(&ts); //添加新节点m_treeCtrl.SelectItem(hNewItem); //选中新节点m_treeCtrl.EnsureVisible(hNewItem);//确保新节点在可视范围内}void CTreeCtrlDlg::OnBUTTONDel(){HTREEITEM hItem = m_treeCtrl.GetSelectedItem(); //当前所选节点if(hItem ==NULL){AfxMessageBox(_T("请选择⼀个节点!"));return ;}HTREEITEM hParent = m_treeCtrl.GetParentItem(hItem); //取得当前节点的⽗节点m_treeCtrl.DeleteItem(hItem); //删除节点m_treeCtrl.SelectItem(hParent);//选中其⽗节点}void CTreeCtrlDlg::OnBUTTONEdit(){HTREEITEM hItem = m_treeCtrl.GetSelectedItem(); //当前选中节点if(hItem == NULL){AfxMessageBox(_T("请选择⼀个节点!"));return ;}CString strText;GetDlgItemText(IDC_EDIT_Text , strText); //⽤户输⼊if(strText.GetLength() == 0){AfxMessageBox(_T("请输⼊⽂本!"));return ;}m_treeCtrl.SetItemText(hItem,strText); //修改节点⽂本}void CTreeCtrlDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) {NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;HTREEITEM hItem = m_treeCtrl.GetSelectedItem(); //当前所选节点if(hItem != NULL){CString strText= m_treeCtrl.GetItemText(hItem);//获取节点⽂本SetDlgItemText(IDC_EDIT_Text , strText); //显⽰在⽂本框中}*pResult = 0;}void CTreeCtrlDlg::OnBUTTONfirst(){m_firstFlag=1;//设置为第⼀级,以便可以再次加⼊到⼀级}。
实验一 树控件

实验一树控件实验一树控件实验一树木控制实验目的:1.了解树木控制的基本原理2.编制简单树控件程序并运行,熟悉树控件的常用操作3.了解树控件的程序结构4.了解树控件的父节点和子节点之间的关系实验内容:1.本实验使用Visual C++6.0程序构建了一个树控件示例。
2添加和设计对话框3完美ctreedlg代码4调用对话框实验步骤:1.添加和设计对话框(1)用mfcappwizard(exe)创建一个默认的单文档应用程序ex_ctrl7sdi。
(2)将对话框资源IDD添加到应用程序树中,标题为“树控件示例”,字体设置为“Arial,No.9”,创建此对话框的类为ctreedlg。
(3)删除[cancel]按钮,将[ok]的标题改为“退出”。
打开对话框网格,参看图的控件布局,为对话框添加一个树控件,取其默认的id号idc_tree1。
打开该控件的属性对话框,按图进行设置。
2.完善的ctreedlg代码(1)打开classwizard的membervariables页面,看看classname是否是ctreedlg,选中idc_tree1,双击鼠标或单击addvariables按钮,为其添加一个控件变量m_treectrl,类型为ctreectrl。
(2)添加图像列表类cimagelist对象m_imagelist(3)用mfcclasswizard为ctreedlg类添加wm_initdialog消息映射,并添加下列初始化代码:(4)用mfcclasswizard为树控件idc_tree1添加nm_rclick(右击)的消息映射,并增加下列代码:voidctreedlg::onrclicktree1(nmhdr*pnmhdr,lresult*presult){cpointpoint;uintuflags;::getcursorpos(&point);//获取当前鼠标m_treectrl的屏幕坐标。
MFC中treeview控件使用方法

MFC Treeview控件方法1,用InsertItem 添加节点参数: 文字,图标,父节点返回: HTREEITEM示例: 添加一系列节点HTREEITEM hItem = m_Tree.InsertItem("root",NULL,NULL);///root就是节点的标题int i,j;for (i=0;i<4;i++){HTREEITEM hSubItem = m_Tree.InsertItem("item",NULL,NULL,hItem);for (j=0;j<3;j++){m_Tree.InsertItem("subitem",NULL,NULL,hSubItem);}}InsertItem函数的第一个参数就是设置他的节点标题2.,用ModifyStyle 设置风格参数: 取消的风格,增加的风格示例: 在对话框初始化时设置风格BOOL CMfc1Dlg::OnInitDialog(){//...m_Tree.ModifyStyle(NULL,TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT); }3,用DeleteItem 删除节点4,用.DeleteAllItems 删除全部节点5,.用Expand 展开/收缩节点参数: 节点HTREEITEM,展开/收缩示例:m_Tree.Expand(hItem,TVE_EXPAND);/////////////////////////////////////////////////////////CTreeCtrl的概述cc++vcCTreeCtrl在三种不同情况下创建的方式1、如果要在对话框窗口上创建树形控件,你需要在对话框类中定义一个CTreeCtrl类型的成员变量。
2、如果树形控件是一个子窗口,你可以使用CTreeCtrl::Create()来构建树形空间对象。
VCMFC中TREE树控件的使用

VC中树控件的使用树控件可以对数据进行分层显示。
在树控件中,除根节点以外,每个节点都有一个父节点,可以拥有多个兄弟节点和子节点,从而可以是数据以梳妆结构清晰的显示出来。
(树控件图标)一.创建树控件BOOL Create(DWORD dwStyle , const RECT & rect , CWnd * pParentWnd ,UINT nID);dwStyle 控件的风格rect 控件显示区域pParantWnd 父窗口指针nID 命令ID值dwStyle中可以使用以下一些树形控件的专用风格:TVS_HASLINES 在父/子结点之间绘制连线TVS_LINESATROOT 在根/子结点之间绘制连线TVS_HASBUTTONS 在每一个结点前添加一个按钮,用于表示当前结点是否已被展开TVS_EDITLABELS 结点的显示字符可以被编辑TVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点TVS_DISABLEDRAGDROP 不允许Drag/DropTVS_NOTOOLTIPS 不使用ToolTip显示结点的显示字符树控件通常和图像列表控件一起使用,在树控件中可以显示图像列表中的图标,即为树控件添加图标。
CImageList * SetImageList(CImageList * pImageList , int nImageListType);pImageList 标识图像列表控件指针nImageListType 标识图像列表类型Eg.m_Tree.Create(TVS_LINESATROOT|TVS_HASLINES|TVS_H ASBUTTONS|WS_BORDER);......m_ImageList.Create(16,16,ILC_COLOR24|ILC_MASK,1,0);......m_Tree.SetImageList(&m_ImageList , LVSIL_NORMAL); 二.向树控件中插入数据在树形控件中每一个结点都有一个句柄(HTREEITEM),同时添加结点时必须提供的参数是该结点的父结点句柄。
mfc ctreeview用法

mfc ctreeview用法MFC CTreeView 是Microsoft Foundation Classes(MFC)中的一个类,用于创建和管理树形视图控件。
树形视图控件是一种常用的界面控件,它通常用于展示层级结构的数据,如文件系统,项目组织或数据库表等。
在本文中,我们将一步一步介绍如何使用MFC CTreeView 创建和管理树形视图控件,包括创建视图类,初始化树形视图,添加节点,展开和折叠节点以及响应节点的选择事件等。
第一步:创建视图类首先,在MFC 应用程序中创建一个新的视图类,以用于展示树形视图控件。
可以使用Visual Studio IDE 中的“添加类”功能来创建视图类。
确保选择“CFormView”为基类,并为视图类命名,例如“CTreeViewDemoView”。
第二步:添加树形视图控件到视图中在视图类的头文件中声明一个CTreeView 对象,以用于管理树形视图控件。
可以使用类向导或手动添加以下代码:cppclass CTreeViewDemoView : public CFormView{...CTreeView m_treeView;...};然后,在视图类的初始化过程中,创建树形视图控件并将其添加到视图中。
可以在OnInitialUpdate 方法中添加以下代码:cppvoid CTreeViewDemoView::OnInitialUpdate(){CFormView::OnInitialUpdate();初始化树形视图控件CRect rect;GetClientRect(&rect);m_treeView.Create(WS_VISIBLE WS_CHILD TVS_HASLINES TVS_LINESATROOT TVS_HASBUTTONS, rect, this, 0);...}第三步:初始化树形视图在树形视图控件创建并添加到视图中后,我们需要初始化树形视图的数据。
MFC中利用树形控件在主对话框当中嵌入子对话框(适合初学者)

这里首先声明,在此使用的是VC6.0编译器。
下面直接讲述步骤,关于原理性的东西请大家看书。
(1) 新建一个基于对话框的MFC应用程序,程序名取为test(2) 拖入一个树形控件(Tree Control)和一个picture控件,并把两者的ID名称更改为ID_Tree_Sel 和ID_STA TIC_BTNAREA,并在属性中把前者的Styles更改如下把后者的Notify属性打上勾(3) 按ctrl+W打开ClassWizard,在Member Variables中为ID_Tree_Sel添加变量m_tree,为ID_STATIC_BTNAREA添加变量m_area(这个变量这里没有用到,可以不添加)(4) 新建两个对话框,ID分别为ID_DIALOG1和ID_DIALOG2,并均按下图更改属性Style 为child和Border为None。
然后在这两个子对话框上分别添加一行文字”This is Dialog 1”和”This is Dialog 2”(5) 在子对话框1上单击右键,进入classwizard,会弹出一个如下图的Adding a Class对话框问你是否建立一个类,选择Create a new class,然后点击OK,在随后出现的对话框中Name:中输入CDlg1,点击OK同样,为第二个子对话框建立一个CDlg2的类(6) 进入testDlg.h文件中,在文件开头加入以下代码#include "Dlg1.h"#include "Dlg2.h"然后新增两个protected类型的变量m_Dlg1和m_Dlg2CDlg1 m_Dlg1;CDlg2 m_Dlg2;转入testDlg.cpp文件中,在OnInitDialog()中加入以下代码BOOL CTestDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herem_tree.DeleteAllItems();m_tree.InsertItem("对话框1");m_tree.InsertItem("对话框2");m_Dlg1.Create(IDD_DIALOG1, this);m_Dlg2.Create(IDD_DIALOG2, this);//根据获得主对话框上图片控件的尺寸,将子对话框嵌入到主对话框中CRect r;GetDlgItem(IDC_STATIC_BTNAREA)->GetWindowRect(r);ScreenToClient(r);GetDlgItem(IDC_STATIC_BTNAREA)->DestroyWindow();/*这里可以把图形控件销毁了,否则子对话框将不会响应你的鼠标消息*/// 定位属性页m_Dlg1.MoveWindow(r);m_Dlg2.MoveWindow(r);//根据所要显示的控件进行对话框的消隐工作m_Dlg1.ShowWindow(SW_HIDE);//显示第一个子对话框m_Dlg2.ShowWindow(SW_HIDE);return TRUE; // return TRUE unless you set the focus to a control}(7) 进入ClassWizard,接下来我们需要为m_tree添加事件响应代码在上面对话框中点OK,然后编辑代码,在OnSelchangedTreeSel中添加如下代码void CTestDlg::OnSelchangedTreeSel(NMHDR* pNMHDR, LRESULT* pResult){NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;TVITEM item0 = pNMTreeView->itemNew;CString str = m_tree.GetItemText(item0.hItem);if (pare(_T("对话框1")) == 0){m_Dlg1.ShowWindow(SW_SHOW);//显示第一个子对话框m_Dlg2.ShowWindow(SW_HIDE);//隐藏第二个子对话框}else{m_Dlg1.ShowWindow(SW_HIDE);//隐藏第一个子对话框m_Dlg2.ShowWindow(SW_SHOW);//显示第二个子对话框}*pResult = 0;}大功告成!!源代码见/downloads283/sourcecode/windows/dialog/detail1279803.html。
MFC VC 中 TreeView 全面解析

MFC VC 中 TreeView 全面解析2011-11-29 14:07:51标签:VC TreeView MFC休闲职场(一)树控制的主要功能树控制和视(Tree Control&View)主要用来显示具有一定层次结构的数据项,如资源管理器中的磁盘目录等,以供用户在其中进行各种选择。
树控制中的每个数据项包括数据项名称的文本字符串和用于表示该数据项的图像,每个数据项下面均可包含各种子项,整个结构就象目录树一样。
对于包含各种子项的数据项,可通过鼠标双击来展开或合拢,这可以通过控制树的不同风格来实现树控制的不同显示形态。
这些风格主要包括:TVS_HASLINES表示用连线来连接父项和它下面的各个子项,这可以使树的显示层次结构更加清晰,但在无父项的各子项之间并没有连线;TVS_LINESATROOT表示在无父项的各子项即根下面的各子项之间存在连线;TVS_HASBUTTONS表示在带有子项的父项前面增加一个带“+”或“-”的按钮,这使得用户也可以通过单击这个小按钮来实现子项的展开和合拢,当存在子项时,按钮的初始状态为“+”,当子项被展开时,按小按钮由“+”变为“-”号,当子项合拢时,小按钮由“-”变为“+”号,这一风格同样对于根项无效,如果需要可通过组合TVS_LINESATROOT风格来实现;TVS_EDITLABELS表示允许让用户单击具有输入焦点的数据项来修改其名称。
对于树控制,MFC中也以两种形式来封装,即树控制(CTREECTRL)和树视(CTREEVIEW),来满足用户的不同需求,对于一般要求的用户如在对话框中应用,使用树控制比较方便,而对于具有较高要求的用户,在使用树视时还具有视窗口的各种方便特性,可以更好地满足文档/视结构的要求。
当在窗口中使用树视时,树视会占满两个窗口的客户区域并自动随窗口的框架结构的调整而调整,并能够很好地处理诸如菜单、加速键和工具条中的各种命令消息。
在使用树视时只要利用其成员函数CtreeView取得其一个引用,就可以象树控制一样方便地应用:CtreeCtrl &treeCtrl = GetTreeCtrl()。
VC-MFC Tree控件的使用

Tree空间的使用一、1.InsertItem 添加节点参数: 文字,图标,父节点返回: HTREEITEM示例: 添加一系列节点HTREEITEM hItem = m_Tree.InsertItem("root",NULL,NULL);///root就是节点的标题int i,j;for (i=0;i<4;i++) {HTREEITEM hSubItem = m_Tree.InsertItem("item",NULL,NULL,hItem);for (j=0;j<3;j++) {m_Tree.InsertItem("subitem",NULL,NULL,hSubItem);}}InsertItem函数的第一个参数就是设置他的节点标题2.ModifyStyle 设置风格参数: 取消的风格,增加的风格示例: 在对话框初始化时设置风格BOOL CMfc1Dlg::OnInitDialog(){//...m_Tree.ModifyStyle(NULL,TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);}3.DeleteItem 删除节点4.DeleteAllItems 删除全部节点5.Expand 展开/收缩节点参数: 节点HTREEITEM,展开/收缩示例:m_Tree.Expand(hItem,TVE_EXPAND);///////////////////////////////////二、VC++中mfc在tree control各个子项目如何添加响应函数的回答很简单:第一步:在向导中给你的树形控件关联一个CTreeCtrl的变量(就像你代码中的m_Mess)第二步:在向导中,添加该树形控件的NM_Click消息(就是鼠标单击消息,以下假设函数名为OnClickTree)第三步:在代码中添加你的数据(主要是在初始化树形控件的数据的函数中,如你代码中的OnInitDialog()就可以)HTREEITEM hRoot = m_ctrlTree.InsertItem("北京");m_ctrlTree.SetItemData(hRoot, 1);HTREEITEM hChild = m_ctrlTree.InsertItem("朝阳区", hRoot);m_ctrlTree.SetItemData(hChild, 2);hChild = m_ctrlTree.InsertItem("海淀区", hRoot);m_ctrlTree.SetItemData(hChild, 3);注意:我在上面用了SetItemData函数,主要是给不同的节点添加不同的标记,在下面的单击消息函数中就可以看出它的作用第四步:在OnClickTree函数中添加鼠标单击消息响应代码CPoint pt = GetCurrentMessage()->pt; //获取当前鼠标点击消息的坐标点m_ctrlTree.ScreenToClient(&pt); //将鼠标的屏幕坐标,转换成树形控件的客户区坐标UINT uFlags = 0;HTREEITEM hItem = m_ctrlTree.HitTest(pt, &uFlags);//然后做点击测试if ((hItem != NULL) && (TVHT_ONITEM & uFlags))//如果点击的位置是在节点位置上面{m_ctrlTree.SelectItem(hItem);//获取开始我们设置的数据,注意这就是我为什么开始要每个节点设置不同的数据的原因。
VC中树形控件(CTreeCtrl)的使用

树型视的三个结构TVINSERTSTRUCT、TVITEM、NMTREEVIEWTVINSERTSTRUCT包含添加新项到树形视控件所使用的信息。
这个结构被TVM_INSERTITEM消息使用。
这个结构与TV_INSERTSTRUCT结构是一样的,但它已经按当前的命名习惯重命名了。
typedef struct tagTVINSERTSTRUCT {HTREEITEM hParent;HTREEITEM hInsertAfter;#if (_WIN32_IE >;= 0x0400)union{TVITEMEX itemex;TVITEM item;} DUMMYUNIONNAME;#elseTVITEM item;#endif} TVINSERTSTRUCT, FAR *LPTVINSERTSTRUCT;成员hParent父项的句柄。
如果这个成员的值是TVI_ROOT或NULL,这项将被作为树形控件的根插入。
hInsertAfter插入的新项之后的项的句柄。
或是下列值之一:TVI_FIRST在列表的开始插入项TVI_LAST在列表的最后插入项TVI_ROOT作为一个根项添加TVI_SORT以字母顺序插入项itemex版本4.71。
TVITEMEX包含关于项添加的信息。
itemTVITEM包含关于项添加的信息。
需求Windows NT/2000:需要Windows NT 3.51或更高版本。
Windows 95/98:需要Windows 95或更高版本。
Header:定义在commctrl.h。
TVITEM指定或接收树形视项的属性。
这个结构与TV_ITEM结构一样,但它已经被当前命名协议重新命名了。
新的应用程序应该使用这个结构。
typedef struct tagTVITEM{UINT mask;HTREEITEM hItem;UINT state;UINT stateMask;LPTSTR pszText;int cchTextMax;int iImage;int iSelectedImage;int cChildren;LPARAM lParam;} TVITEM, FAR *LPTVITEM;成员mask指出其它的结构成员哪些包含有效数据的标记数组。
在VisualFoxPro中使用TreeView控件TreeView控件VFP时...

在VisualFoxPro中使用TreeView控件TreeView控件VFP时...在Visual FoxPro中使用TreeView控件如果用户在设计程序时,需要用一种树形结构生动形象地显示具有不同层次的数据,那么TreeView控件将是最合适的选择。
TreeView控件可以将用户选定的数据,也可以是从数据库中检索出来的数据,供用户自由的选择、展开或折迭收起。
TreeView控件主要用以显示层次数据之间的关系。
TreeView控件的特点包括以下几个方面:1、将相互间有联系的数据用图形与文字方式以树形描绘,以树形节点(Node对象)的形式展开或收起数据;2、每一个节点可以用图标和文本标签来描述;3、标签可以设置为是否允许修改的属性;4、对层次深度和节点数目无限制,只受系统资源的限制。
另外,使用TreeView控件对管理信息量很大的数据来说,是一个很好的方式,因为用户能从中简单快速的选择到所需要的数据。
Windows资源管理器就是TreeView控件、ImageList控件与ListView控件配合应用的一个例子。
TreeView控件是Microsoft Visual Studio 中的一个控件,它是Mscomctl.ocx文件中的一组ActiveX控件的一部分。
当安装了Visual FoxPro或Visual Basic后就可以在Windows的System目录中找到这个文件。
为了在发布的应用程序中使用TreeView控件,必须将Mscomctl.ocx文件与应用程序一起做成安装盘发布。
这个控件在Visual FoxPro 5.0中的版本是5.0,但是该控件的5.0版本不支持6.0版本的一些属性、方法和事件,所以要尽量使用6.0版本。
如果没有Visual FoxPro 6.0也可以,只要找到Mscomctl.ocx这个文件并将其注册,就可以在Visual FoxPro 5.0中使用该控件的6.0版本。
树形控件-基础

vc树形控件TreeCtrl经验总结(一)树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上有允许有一个或多个或没有子结点。
MFC中使用CTreeCtrl类来封装树形控件的各种操作。
通过调用BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些树形控件的专用风格:TVS_HASLINES 在父/子结点之间绘制连线TVS_LINESATROOT 在根/子结点之间绘制连线TVS_HASBUTTONS 在每一个结点前添加一个按钮,用于表示当前结点是否已被展开TVS_EDITLABELS 结点的显示字符可以被编辑TVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点TVS_DISABLEDRAGDROP 不允许Drag/DropTVS_NOTOOLTIPS 不使用ToolTip显示结点的显示字符在树形控件中每一个结点都有一个句柄(HTREEITEM),同时添加结点时必须提供的参数是该结点的父结点句柄,(其中根Root结点只有一个,既不可以添加也不可以删除)利用HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST );可以添加一个结点,pszItem为显示的字符,hParent代表父结点的句柄,当前添加的结点会排在hInsertAfter表示的结点的后面,返回值为当前创建的结点的句柄。
下面的代码会建立一个如下形式的树形结构:+--- Parent1+--- Child1_1+--- Child1_2+--- Child1_3+--- Parent2+--- Parent3HTREEITEM hItem,hSubItem;hItem = m_tree.InsertItem("Parent1",TVI_ROOT);在根结点上添加Parent1hSubItem = m_tree.InsertItem("Child1_1",hItem);//在Parent1上添加一个子结点hSubItem = m_tree.InsertItem("Child1_2",hItem,hSubItem);//在Parent1上添加一个子结点,排在Child1_1后面hSubItem = m_tree.InsertItem("Child1_3",hItem,hSubItem);hItem = m_tree.InsertItem("Parent2",TVI_ROOT,hItem);hItem = m_tree.InsertItem("Parent3",TVI_ROOT,hItem);如果你希望在每个结点前添加一个小图标,就必需先调用CImageList*SetImageList( CImageList * pImageList, int nImageListType );CImageList指向一个CImageList对象,如果这个值为空,则CTreeCtrl中的Image将被移除。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC中树控件的使用树控件可以对数据进行分层显示。
在树控件中,除根节点以外,每个节点都有一个父节点,可以拥有多个兄弟节点和子节点,从而可以是数据以梳妆结构清晰的显示出来。
(树控件图标)一.创建树控件BOOL Create(DWORD dwStyle , const RECT & rect , CWnd * pParentWnd ,UINT nID);dwStyle 控件的风格rect 控件显示区域pParantWnd 父窗口指针nID 命令ID值dwStyle中可以使用以下一些树形控件的专用风格:TVS_HASLINES 在父/子结点之间绘制连线TVS_LINESATROOT 在根/子结点之间绘制连线TVS_HASBUTTONS 在每一个结点前添加一个按钮,用于表示当前结点是否已被展开TVS_EDITLABELS 结点的显示字符可以被编辑TVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点TVS_DISABLEDRAGDROP 不允许Drag/DropTVS_NOTOOLTIPS 不使用ToolTip显示结点的显示字符树控件通常和图像列表控件一起使用,在树控件中可以显示图像列表中的图标,即为树控件添加图标。
CImageList * SetImageList(CImageList * pImageList , int nImageListType);pImageList 标识图像列表控件指针nImageListType 标识图像列表类型Eg.m_Tree.Create(TVS_LINESATROOT|TVS_HASLINES|TVS_H ASBUTTONS|WS_BORDER);......m_ImageList.Create(16,16,ILC_COLOR24|ILC_MASK,1,0);......m_Tree.SetImageList(&m_ImageList , LVSIL_NORMAL); 二.向树控件中插入数据在树形控件中每一个结点都有一个句柄(HTREEITEM),同时添加结点时必须提供的参数是该结点的父结点句柄。
格式:1.HTREEITEM insertItem(LPTVINSERTSTRUCT lpInsertStruct); lpInsertStructLPTVINSERTSTRUCT结构指针,LPTVINSERTSTRUCT结构中包含了插入操作的详细信息。
2.HTREEITEM insertItem(UINT nMask ,LPCTSTR lpszItem ,int nImage ,int nSelectdeImage ,UINT nState ,UINT nStateMask , LPARAMlParam ,HTREEITEM hParent ,HTREEITEM hInsertAfter);nMask 节点的哪些信息被设置lpszItem 节点的文本nImage 节点的图像索引nSelectdeImage 节点状态nSelectdeImage 节点选中时的图标索引nStateMask 节点的哪些状态被设置lParam 指定关联节点的附加信息hParent 父节点句柄hInsertAfter 新插入节点后面的节点句柄3. HTREEITEM insertItem(LPCTSTR lpszItem ,HTREEITEM hParent =TVI_ROOT, HTREEITEM hInsertAfter=TVI_LAST);4. HTREEITEM insertItem(LPCTSTR lpszItem , int nImage ,int nSelectedImage ,HTREEITEM hParent =TVI_ROOT,HTREEITEM hInsertAfter=TVI_LAST);三.展开或收缩树控件节点BOOL Expand(HTREEITEM hItem ,UINT nCode);hItem 展开的节点句柄nCode 展开的动作TVE_COLLAPSE: 收缩所有节点TVE_COLLAPSERESET: 收缩节点,移除子节点TVE_EXPAND: 展开所有节点TVE_TOGGLE: 展开或收缩当前节点四.删除节点BOOL DeleteItem(HTREEITEM hItem);hItem 是删除节点的句柄BOOL DeleteAllItem(); 删除所有节点为了掌握上述的使用方法,下面举例说明:创建树控件步骤:1.创建一个基于对话框的应用程序,声明一个CTreeCtrl类变量m_Tree及一个图像列表对象m_ImageList, 向工程中导入想要显示的图标资源。
2.在OnInitDialog()函数中输入如下程序m_Tree.Create(TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS| WS_BORDER|LVS_SHOWSELALWAYS,CRect(0,0,0,0),this,10001);//创建树控件m_Tree.MoveWindow(10,10,300,200); //设置树控件显示位值m_Tree.ShowWindow(SW_SHOW); //显示控件//当已经在对话框中添加数控件并设置完成时,不用写以上三句m_ImageList.Create(16,16,ILC_COLOR24|ILC_MASK,1,0);m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));.......................................//此处省略向图像列表中添加图标,图标个数由编程者决定m_Tree.SetImageList(&m_ImageList , LVSIL_NORMAL);HTREEITEM m_Root;m_Root=m_tree.InsertItem("根节点想输入的文本",0,0); //根节点HTREEITEM m_Child;m_Child=m_tree.InsertItem("根节点下的子节点" ,0,0, m_Root );........................//此处省略节点个数按照需要添加//注:没加深一层节点,都需要声明保存该层节点的变量。
如HTREEITEM //m_Child;m_Tree.Expand(m_Root,TVE_EXPAND);3.删除选中节点HTREEITEM m_Item=m_Tree.GetSelectedItem();m_Tree.DeleteItem(m_Item);五.获取选中节点HTREEITEM m_Item = m_Tree.GetSelectedItem();//获取选中节点句柄CString m_sql=m_tree.GetItemText(m_Item);//选中节点的文本值六.获取选中节点的父节点HTREEITEM Parent=m_tree.GetParentItem(m_Item);CString strParent=m_tree.GetItemText( Parant);获得根节点HTREEITEM Root=m_tree.GetRootItem();获得一个节点的子节点HTREEITEM Child=m_tree.GetChildItem(m_node);//m_node为操作节点int GetNextItem( int nItem, int nFlags ) const如果成功则返回下一个项的句柄;否则返回NULL。
nFlags可以是下列值之一:TVGN_CARET 获取当前被选择的项。
TVGN_CHILD 获取第一个子项。
TVGN_DROPHILITE 获取是一次拖放操作的目标的项。
TVGN_FIRSTVISIBLE 获取第一个可见的项。
TVGN_NEXT 获取下一个兄弟项。
TVGN_NEXTVISIBLE 获取跟随在指定项之后的下一个可视项。
TVGN_PARENT 获取指定项的父项。
TVGN_PREVIOUS 获取前一个兄弟项。
TVGN_PREVIOUSVISIBLE 获取在指定项之前的第一个可视项。
TVGN_ROOT 获取根项的第一个子项,指定项是该根项的一个部分。
Eg.m_child=m_Tree1.GetNextItem(m_child,TVGN_NEXT);附录1是本人所编的一个程序,仅供参考附录BOOL CTreeDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization here此处一下为添加程序HTREEITEM m_Child,m_Child1,m_Child2;HTREEITEM m_Root;m_Root=m_tree.InsertItem("树形结构示例",0,0); //根节点m_Child=m_tree.InsertItem("Cancer",0,0,m_Root); //第一层子节点m_Child1=m_tree.InsertItem("MASS",0,0,m_Child); //第一个节点下的子节点,m_Child2=m_tree.InsertItem("Density",0,0,m_Child1);m_tree.InsertItem("fat containing",0,0,m_Child2);m_tree.InsertItem("low density",0,0,m_Child2);m_tree.InsertItem("equal density",0,0,m_Child2);m_tree.InsertItem("high density",0,0,m_Child2);m_Child2=m_tree.InsertItem("Shape",0,0,m_Child1);m_tree.InsertItem("IRREGULAR",0,0,m_Child2);m_tree.InsertItem("ARCHITECTURAL_DISTORTION",0,0,m_Child2);m_tree.InsertItem("LOBULATED",0,0,m_Child2);m_tree.InsertItem("OV AL",0,0,m_Child2);m_tree.InsertItem("ROUND",0,0,m_Child2);m_Child2=m_tree.InsertItem("Margins",0,0,m_Child1);//第四层2m_tree.InsertItem("ILL_DEFINED",0,0,m_Child2);m_tree.InsertItem("SPICULATED",0,0,m_Child2);m_tree.InsertItem("N/A",0,0,m_Child2);m_tree.InsertItem("CIRCUMSCRIBED",0,0,m_Child2);m_tree.InsertItem("MICROLOBULATED",0,0,m_Child2);m_tree.InsertItem("OBSCURED",0,0,m_Child2);m_Child2=m_tree.InsertItem("benign",0,0,m_Child1);m_Child2=m_tree.InsertItem("malignant",0,0,m_Child1);m_Child1=m_tree.InsertItem("CALCIFICATION",0,0,m_Child);//第二层2m_Child2=m_tree.InsertItem("Density",0,0,m_Child1);m_tree.InsertItem("fat containing",0,0,m_Child2);m_tree.InsertItem("low density",0,0,m_Child2);m_tree.InsertItem("equal density",0,0,m_Child2);m_tree.InsertItem("high density",0,0,m_Child2);m_Child2=m_tree.InsertItem("type",0,0,m_Child1);//第四层2m_tree.InsertItem("LUCENT_CENTER",0,0,m_Child2);m_tree.InsertItem("ROUND_AND_REGULAR",0,0,m_Child2);m_tree.InsertItem("PLEOMORPHIC",0,0,m_Child2);m_tree.InsertItem("AMORPHOUS",0,0,m_Child2);m_tree.InsertItem("FINE_LINEAR_BRANCHING",0,0,m_Child2);m_tree.InsertItem("PUNCTATE",0,0,m_Child2);m_Child2=m_tree.InsertItem("distribution",0,0,m_Child1);//第四层3 m_tree.InsertItem("SEGMENTAL",0,0,m_Child2);m_tree.InsertItem("REGIONAL",0,0,m_Child2);m_tree.InsertItem("CLUSTERED",0,0,m_Child2);m_tree.InsertItem("LINEAR",0,0,m_Child2);m_tree.InsertItem("N/A",0,0,m_Child2);m_tree.InsertItem("DIFFUSE",0,0,m_Child2);m_Child2=m_tree.InsertItem("benign",0,0,m_Child1);m_Child2=m_tree.InsertItem("malignant",0,0,m_Child1);return TRUE; // return TRUE unless you set the focus to a control }运行结果如图。