C++ 控件之 CTree

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
(一)树控制的主要功能 树控制和视(Tree Control&View)主要用来显示具有一定层次结构的数据项,如资源管理器中的磁盘目录等,以供用户在其中进行各种选择。树控制中的每个数据项包括数据项名称的文本字符串和用于表示该数据项的图像,每个数据项下面均可包含各种子项,整个结构就象目录树一样。对于包含各种子项的数据项,可通过鼠标双击来展开或合拢,这可以通过控制树的不同风格来实现树控制的不同显示形态。这些风格主要包括: TVS_HASLINES表示用连线来连接父项和它下面的各个子项,这可以使树的显示层次结构更加清晰,但在无父项的各子项之间并没有连线; TVS_LINESATROOT表示在无父项的各子项即根下面的各子项之间存在连线; TVS_HASBUTTONS表示在带有子项的父项前面增加一个带“+”或“-”的按钮,这使得用户也可以通过单击这个小按钮来实现子项的展开和合拢,当存在子项时,按钮的初始状态为“+”,当子项被展开时,按小按钮由“+”变为“-”号,当子项合拢时,小按钮由“-”变为“+”号,这一风格同样对于根项无效,如果需要可通过组合TVS_LINESATROOT风格来实现; TVS_EDITLABELS表示允许让用户单击具有输入焦点的数据项来修改其名称。 对于树控制,MFC中也以两种形式来封装,即树控制(CTREECTRL)和树视(CTREEVIEW),来满足用户的不同需求,对于一般要求的用户如在对话框中应用,使用树控制比较方便,而对于具有较高要求的用户,在使用树视时还具有视窗口的各种方便特性,可以更好地满足文档/视结构的要求。当在窗口中使用树视时,树视会占满两个窗口的客户区域并自动随窗口的框架结构的调整而调整,并能够很好地处理诸如菜单、加速键和工具条中的各种命令消息。在使用树视时只要利用其成员函数CtreeView取得其一个引用,就可以象树控制一样方便地应用:CtreeCtrl &treeCtrl = GetTreeCtrl()。 (二)树控制的对象结构 1、树控制的建立方法 CtreeCtrl&treeCtrl 建立树控制对象结构 Create 建立树控制并绑定对象 树控制CTreeCtrl::Create的调用格式如下: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); 其中参数dwStyle用来确定树控制的类型;rect用来确定树控制的大小和位置;pParentWnd用来确定树控制的父窗口,通用是一个对话框并且不能为NULL;nID用来确定树控制的标识。树控制的风格可以是下列值的组合: TVS_HASLINES 表示树控制在各子项之间存在连线; TVS_LINESATROOT 表示树控制在根项之间存在连线; TVS_HASBUTTONS 表示树控制视在父项左侧存在展开合拢控制按钮; TVS_EDITLABELS 表示可以控制鼠标单击修改树项的名称; TVS_SHOWSELALWAYS 表示选中项即使在窗口失去输入焦点时仍然保持选中状态; TVS_DISABLEDRAGDROP表示禁止树控制发送TVN_BEGINDRAG消息 2、树控制的属性类 树控制属性类包括取得树控制中项数GetCount、取得树控制中项相对于父项的偏移值 GetIndent、取得树控制图像列表控制句柄GetImageList、设置树控制图像列表控制句柄SetImageList、取得匹配下一个树项 GetNextItem、判断给定树项是否包含子项ItemHasChildren、取得树项子项GetChildItem、取得下一个同属树项 GetNextSiblingItem、取得前一个同属树项GetPrevSiblingItem、取得父树项GetParentItem、取得第一个可视树项GetFirstVisibleItem、取得下一个可视树项GetNextVisible Item、取得前一个可视的树项GetPrevVisibleItem、取得被选中的树项GetSelectedItem、取得根树项 GetRootItem、取得树项的属性GetItem、设置树项的属性SetItem、取得树项的状态GetItemState、设置树项的状态 SetItemState、取得与树项关联图像GetItemImage、设置与树项关联图像SetItemImage、取得树项文本 GetItemText、设置树项文本SetItemText和取得树项编辑控制句柄GetEditControl等。 3、树控制的操作方法 树控制的操作方法包括插入一个树项InsertItem、删除一个树项DeleteItem、删除所有树项DeleteAllItems、展开或合拢树项的子项Expand、选中特定树项SelectItem、选择一个树项作为第一个可视树项 SelectSetFirstVisible、编辑一个可视的树项EditLabel和排序给定父树项的子树项SortChildren等。 (三)树控制的数据结构 在使用树控制时需要了解两个个非常重要的数据结构TV_ITEM和TV_INSERTSTRUCT,前一个数据结构是用来表示树控制的树项信息,后一个数据结构是用来定义将树项增加到数据控制中所需要的数据内容。另外,还需要NM_TREEVIEW、 TV_DISPINFO和TV_HITTESTINFO三个数据结构,这几个数据结构的定义方法如下: ①基本数据项结构 typedef struct _TV_ITEM { UINT mask; //结构成员有效性屏蔽位 HTREEITEM hItem; //数据项控制句柄 UINT state; //数据项状态 UINT stateMask; //状态有效性屏蔽位 LPSTR pszText; //数据项名称字符串 int cchTextMax; //数据项名称的最大长度 int iImage; //数据项图标索引号 int iSelectedImage;//选中数据项图标索引号 int cChildren; //子项标识 LPARAM lParam; //程序定义的32位数据 } TV_ITEM, FAR *LPTV_ITEM; ②插入树项结构 typedef struct _TV_INSER TSTRUCT { HTREEITEM hParent; //父项控制句柄 HTREEITEM hInsertAfter; //插入树项的位置 TV_ITEM item; //数据项的结构 } TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT; 其中插入的位置如果是TVI_FIRST 或TVI_LAST ,则分别插入到树控制的最前面或最后面,如果是TVI_SORT ,则插入的树项自动插入到合适的位置。 ③树控制通知消息结构 typedef struct _NM_TREEVIEW { NMHDR hdr; //通知消息句柄 UINT action; //通知消息标志 TV_ITEM itemOld; //原来的数据结构 TV_ITEM itemNew; //新的数据结构 POINT ptDrag; //拖动指针 } NM_TREEVIEW; ④取得或设置数据结构 typedef struct _TV_DISPINFO { tvdi NMHDR hdr; //通知消息控制句柄 TV_ITEM item; //数据项结构 } TV_DISPINFO; ⑤指针测试数据结构 typedef struct _TVHITTESTINFO { tvhtst POINT pt; //客户区域屏幕坐标指针 UINT flags; //存放测试结果的变量 HTREEITEM hItem; //测试的数据项结构 } TV_HITTESTINFO, FAR *LPTV_HITTESTINFO; 其中flags测试结果可以是如下值: TVHT_ABOVE 在客户区域上面 TVHT_BELOW 在客户区域下面 TVHT_NOWHERE 在客户区域中并在最后一项下面 TVHT_ONITEM 在与树项关联的位图或标签内 TVHT_ONITEMBUTTON 在与树项关联的按钮上 TVHT_ONITEMICON 在与树项关联的位图上 TVHT_ONITEMINDENT 在与树项关联的联线上 TVHT_ONITEMLABEL 在与树项关联的标签上 TVHT_ONITEMRIGHT 在树项的右侧区域中 TVHT_ONITEMSTATEICON 在用户定义的状态图标上 TVHT_TOLEFT 在客户区域的左侧 TVHT_TORIGHT 在客户区域的右侧 (四)树控制的应用技巧示例 这里仍以基于对话框演示实例来具体介绍树控制及其和图像列表相结构的应用技巧: 通过“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 5、选中树控制控件,选择“VIEW->ClassWizard->Memory Variables。骺刂艻DC_TREECTRL 引入成员变量,其变量类型为: 变量名 种类 变量类型 m_TreeCtrl Control CTreeCtrl 同时利用“MESSAGES MAP”为各命令按钮增加控制功能函数。 6、然后在代码文件VCTREEDlg.CPP中分别加入如下控制代码: (1)在文件开始处增加图像列表定义 CImageList Cil1,Cil2;//大小图标像列表 (2)在初始化文件开始处增加代码 BOOL CVCTREEDlg::OnInitDialog() { CDialog::OnInitDialog(); ......//原来其它代码 // TODO: Add extra initialization here // 此处开始增加代码 CVCTREEApp *pApp=(CVCTREEApp *)AfxGetApp();//创建图象列表 Cil1.Create(16,16,ILC_COLOR,2,2); Cil1.Add(pApp->LoadIcon(IDI_PM)); Cil1.Add(pApp->LoadIcon(IDI_CJ)); m_TreeCtrl.SetImageList(&Cil1,TVSIL_NORMAL); //设置图象列表 DWORD dwStyles=GetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE);//获取树控制原风格 dwStyles|=TVS_EDITLABELS|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT; SetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE,dwStyles);//设置风格 char * CJ[4]={"玉溪卷烟厂","云南卷烟厂","沈阳卷烟厂","成都卷烟厂"};//根数据名称 char * PM[4][5]={ {"红梅一","红梅二","红梅三","红梅四","红梅五"},//产品数据项 {"白梅一","白梅二","白梅三","白梅四","白梅五"}, {"绿梅一","绿梅二","绿梅三","绿梅四","绿梅五"}, {"青梅一","青梅二","青梅三","青梅四","青梅五"}}; 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_SELECTEDIMAGE;//设屏蔽 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)增加树项功能的实现 在增加树项功能时,除了需要定义和设置插入树项的数据结构之外,还需要注意的是新增树项的名称初始时均为“新增数据”,增加后允许用户给数据项设置自定义名称。在编程时应特别注意m_TreeCtrl.EditLabel(hInsert);后面不能跟任何其它程序命令,否则这条编辑指令无效。 void CVCTREEDlg::OnAdd() { //增加子项功能函数 HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选择项句柄 if(hSel==NULL) return;//无任何选项则返回 static int nAddNo=100;//编号大于100为新增数据 TV_INSERTSTRUCT TCItem;//定义插入项数据结构 TCItem.hParent=hSel; //设置父项句柄 TCItem.hInsertAfter=TVI_LAST;//在最后增加 TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽 TCItem.item.pszText="新增数据"; TCItem.item.lParam=nAddNo++;//索引号增加 TCItem.item.iImage=0;//正常图标 TCItem.item.iSelectedImage=1;//选中时图标 HTREEITEM hInsert=m_TreeCtrl.InsertItem(&TCItem);//增加 m_TreeCtrl.Expand(hSel,TVE_EXPAND); m_TreeCtrl.EditLabel(hInsert);//修改增加的数据 } (4)删除树项功能的实现 在实现删除功能时,应对存在子项的树项进行提示,以警告用户是否连同其子项一起删除。 void CVCTREEDlg::OnDel() { //删除子项功能函数 HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄; if(hSel==NULL) return;//无任何选项则返回 if(m_TreeCtrl.ItemHasChildren(hSel))//判断是否有子项 if(MessageBox("厂家下存在品名,一同删除?","警告",MB_YESNO)==IDNO) return; m_TreeCtrl.DeleteItem(hSel); } (5)排序功能的实现 排序功能是对所选中的树项的所有子项按字符中顺序进行排序,如果想要按照其它规则进行排序,应利用SortChildrenItemBC()函数进行自行开发排序程序,这个自行开发的函数与列表控制中实现的函数基本相同,可兴趣的读可以试验。 void CVCTREEDlg::OnSort() { //排序子项功能函数 HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄; if(hSel==NULL) return;//无任何选项则返回 m_TreeCtrl.SortChildren(hSel); } (6)查看功能的实现 查看功能用来查看选中树项的有关信息,函数中中显示了树项的文本名称和标识号,可以将这两个信息作为查找关键字,来查看其它更详细的信息。 void CVCTREEDlg::OnView() { //查看选中项功能函数 HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄; if(hSel==NULL) return;//无任何选项则返回 CString cText=m_TreeCtrl.GetItemText(hSel);//取得数据项名 LONG IDs=m_TreeCtrl.GetItemData(hSel);//取得数据项序号 char temp[100]; wsprintf(temp,"厂家:%s 编号:%05d",cText,IDs); MessageBox(temp,"选择信息"); } (7)修改功能的实现 如果不进行其它处理,当修改树项的文本名称后,就会发现其未被修改,这是因为程序中没有对修改结果进行保存处理,这就要利用TV_DISPINFO结构和SetItemText函数对TVN_ENDLABELEDIT进行处理,这样就可以正确地实现修改功能。 void CVCTREEDlg::OnEndlabeleditTree(NMHDR* pNMHDR, LRESULT* pResult) { TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; // TODO: Add your control notification handler code here if(pTVDispInfo->item.pszText==0) return;//用户取消修改操作 m_TreeCtrl.SetItemText(pTVDispInfo->item.hItem, pTVDispInfo->item.pszText);//设置新数据 *pResult = 0; } 7、树视的演练技巧 树视的应用技巧在使用树视时,其方法与树控制基本相同,只不过树视是在窗口中来实现的而树控制是在对话框中实现,树视的各种功能是通过菜单来实现的而树控制是通过按钮等方式来实现的,树控制需要在对话框中创建树控制控件而树视直接占据整个窗口,在设计过程中只要将按钮和树控制设计过程变为菜单设计,并注意在功能函数是在类向导中是通过菜单命令来操作,同时在每个功能函数前面增加取得列表视引用的命令(CTreeCtrl& TreeCtrl = GetTreeCtrl()),而其余数据结构和代码均不需要修改,实现起来比较容易。笔者实现的树控制和视程序的运行结果如下: 树控制的演练示例结果 树
SGG Trans【VCTree:Learning to Compose Dynamic Tree Structures for Visual Contexts】19pytorch 20.12.11 Learning to Compose Dynamic Tree Structures for Visual Contexts摘要1. Introduction三级目录 摘要 我们建议构成动态树结构,以将图像中的对象置于视觉环境中,以帮助进行诸如场景图生成和视觉问答的视觉推理任务。 与现有的结构化对象表示形式(包括链和完全连接的图)相比,我们的可视化上下文树模型(称为VCTREE)具有两个关键优势:1)高效且富有表现力的二叉树编码对象之间固有的并行/层级关系,例如“衣服”和“裤子” “通常同时出现,并且属于 阅读详情

相关推荐

VC++实现MFC控件节点删除功能实战指南

控件是一种图形用户界面组件,常用于以层级结构展示信息,如文件系统的目录结构、组织结构图等。其视觉表现类似于自然界中的树木,由根节点(Root Node)开始,通过枝干(Branch Nodes)延伸出子节点(Child Nodes),形成一种层次分明的数据表现形式。

weixin_42605397的博客 546

CTree树形选择组件

VUE组件,ElementUI风格的自定义tree树形组件,内容简单明了,展示多级列表,或者进行权限列表显示,选择操作。

MFC中的可拖拽树控件ctreeEx开发指南

在现代的软件应用中,拖拽操作提供了一种直观且用户友好的交互方式。特别是在树形控件中,通过拖拽,用户可以快速地对数据项进行移动、排序或重新组织,极大地增强了软件的可用性和效率。CTreeCtrl类是MFC(Microsoft Foundation Classes)中的一个控件类,用于创建和管理树形视图控件。树形视图控件是一种图形界面元素,它以树状层次结构展示信息,适用于表现如文件系统、组织结构等具有层次性的数据。

weixin_42518334的博客 1144

VC++操作Tree控件

摘要:VC/C++源码,数据库应用,Tree控件  VC++操作Tree控件,点击TRee的节点可依次展开二级节点,Tree节点应用是相当广泛的。要运行程序必须将数据库文件夹Database(包含数据库文件City.mdb)与可执行文件放在一起,如果在vc开发环境中运行,则需要将该数据库文件夹放在工程目录下。

树形控件CTreeCtrl的使用详解(一)

树型视的三个结构TVINSERTSTRUCT、TVITEM、NMTREEVIEW TVINSERTSTRUCT 包含添加新项到树形视控件所使用的信息。这个结构被TVM_INSERTITEM消息使用。这个结构与TV_INSERTSTRUCT结构是一样的,但它已经按当前的命名习惯重命名了。typedef struct tagTVINSERTSTRUCT { H...

weixin_34152820的博客 1356

ctree(条件推断决策树)的个人理解

个人的一些理解,不一定对。首先对因变量和单个自变量进行卡方检验,计算出因变量与所有自变量的卡方值,选择p值小于阈值(如0.05,一般小样本和中等样本都为0.05)的自变量进入模型,这时已经确定好那些自变量进入模型,下一步就是选择哪个zi自变量作为第一次分割的自变量,方法:在进入模型的自变量中,选择与因变量的相关性最高的那个自变量作为第一次分割的自变量。那么,怎么来划分呢,就是用置换检验来确定。置换...

yaoqsm的博客 6022

树形控件的使用例子

  CTree(一)树控制的主要功能树控制和视(Tree Control&View)主要用来显示具有一定层次结构的数据项,如资源管理器中的磁盘目录等,以供用户在其中进行各种选择。树控制中的每个数据项包括数据项名称的文本字符串和用于表示该数据项的图像,每个数据项下面均可包含各种子项,整个结构就象目录树一样。对于包含各种子项的数据项,可通过鼠标双击来展开或合拢,这可以通过控制树的不同风格来

lanse8482的专栏 2882

vc++树形控件CTreeCtrl)使用简介

 from:http://blog.csdn.net/dongle2001/articles/429704.aspx  树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上有允许有一个或多个或没有子结点。MFC中使用CTreeCtrl类来封装树形控件的各种操作。通过调用BOOL Create( DWORD dwStyle, const RECT& r

jason's tech blog 2330

】VC中树形控件CTreeCtrl)的使用

树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上有允许有一个或多个或没有子结点。MFC中使用CTreeCtrl类来封装树形控件的各种操作。通过调用 BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); 创建一个窗口,dwStyle中可以使用以下一些树形控

sky_lily_1985的专栏 2096

CTreeCtrl控件学习第一课

   发现自己学习的一个缺陷就是,学习某样东西时,总是还没有掌握第一点,就急切的想去掌握第二点。很多时候效果很差,也很打击自己学习的主动性啊。   对于CTreeCtrl控件,在工作中使用得不是很多,又由于其和CListCtrl在使用上有很多类似的地方,以至于在只使用其简单功能的时候均根据使用CListCtrl的经验去使用就可。也基本上能够很好地工作。但是,总不能这样吧,对某样东西了解得不够深

走出憧憬的专栏 1549

c语言ctree,C++ CTreeview的checkbox使用方法

1. 消息事件(1)鼠标点击当前ITEM的CHECKBOX:引发NM_CLICK事件并传递TVHT_ONITEMSTATEICON。(2)鼠标点击当前ITEM的TEXT:引发NM_CLICK事件。(3)鼠标点击新ITEM的CHECKBOX:引发TVN_SELCHANGED事件、NM_CLICK事件并传递TVHT_ONITEMSTATEICON。(4)鼠标点击新ITEM的TEXT:引发NM_CLIC...

weixin_31783001的博客 382

CTree Ctrl控件右键选中某一项,并弹出菜单的一段代码!

 CPoint   point(::GetMessagePos());    m_tree.ScreenToClient(&point);    UINT   Flags;    HTREEITEM   hItem   =   m_tree.HitTest(point,   &Flags);  CString strtext=m_tree.GetItemText(hItem); m_tree.Se

stone的备忘录 997

弹出菜单TrackPopupMenu与Ctree结合

0在stdafx.h中进行准备工作 #define _UNIT_ONE 0 #define _UNIT_TWO 1 #define _UNIT_THREE 2 #define _UNIT_FORE 3 typedef struct tag_tree { unsigned long nType; char t_name[20]; int  t_id; }TRE

471

树形控件的使用

想要得到这个格式的程序

ilikehigame的专栏 726

C++ CTreeview的checkbox使用方法

1. 消息事件   (1)鼠标点击当前ITEM的CHECKBOX:引发NM_CLICK事件并传递TVHT_ONITEMSTATEICON。   (2)鼠标点击当前ITEM的TEXT:引发NM_CLICK事件。   (3)鼠标点击新ITEM的CHECKBOX:引发TVN_SELCHANGED事件、NM_CLICK事件并传递TVHT_ONITEMSTATEICON。   (4)鼠标点击新ITEM的TE...

weixin_33937913的博客 278

MFC中应用CTreeCtrl控件的技巧

关键词: VC,    CTreeCtrl,    控件                                           转自http://www.vckbase.com/document/viewdoc/?id=1637   首先,我们要创建一个基本对话框的MFC工程MFC_TreeCRTL(名字随便给一个)。然后在资源视图中插入两个Dialog,ID分别为IDD_D

g710710的专栏 1071

MFC开发-MFC控件 将一棵树全部展开

主要是使用以下两个函数:m_TreeControl是树控件所关联的CTreeCtrl变量。[cpp] view plain copy//展开树控件的所有结点函数,结合下面的函数一起用  void CDialogModelTree::ItemExpandTree()  {      MyExpandTree(m_TreeControl.GetRootItem());  }    //展开树控件的所有...

goldDaNiu的博客 1028

VC++(关于CTreecontrol控件的用法 )

当我们用鼠标单击树形控件的某一项(根节点or子项) 这是单击鼠标后的消息响应,当然也可以响应其他消息。这个调用的是OnSelchanged消息。 void CTREEDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; ...

weixin_30312659的博客 197

MFC树形控件详细分析与代码实现

MFC树形控件详细分析与代码实现   2010-04-07 09:12:12|  分类: C++ |  标签: |字号大中小 订阅    树视图控件具有层次分明、结构化强、美观、灵活等特点,在各种操作系统中广为应用,是人们最熟悉、最常应用的控件。 从树视图控件出现到现在,它们一直被认为非常复杂并难于编程,与其它如编辑框、单选钮、复选框等控件进行比较,要使其正常运行,

avatar1912的专栏 1204
上一篇: C++控件之 CList
下一篇: Win32汇编语言教程
xmlscript
博客等级 码龄25年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值