`
yuanlanjun
  • 浏览: 1185323 次
文章分类
社区版块
存档分类
最新评论

树形控件

 
阅读更多
  树形控件是一种可以分级显示项目列表的窗口,其所含项目以相互关联的方式显示在控件中,通过点击位于某个层次的项目节点可以展开下一层次中从属于该节点的所有项目。树形控件非常适合于管理那些层次较多且相互间隶属关系较为清晰的项目元素。在MFC中,由CTreeCtrl类提供了对树形控件的功能支持。

  在用Create()创建了一个树形控件后可以用SetImageList()函数为其设置一个图象列表,这样就可以在树形控件中为各个层次的项目设置图标。通过InsertItem()函数可以为其添加数据项,返回的HTREEITEM类型的句柄唯一标识了此添加的项目。该句柄应当妥善保管,只有通过该句柄才能为此项目继续添加子项目。如果在创建子窗口时指定父窗口句柄为NULL,则将直接在根目录创建项目。下面这段代码将通过上述函数创建一个树形控件并向其添加二个层次的项目:

// 创建一个树形控件
m_ctrTreeCtrl.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_LINESATROOT | TVS_HASLINES | TVS_HASBUTTONS | TVS_EDITLABELS, CRect(500, 50, 670, 200),this, IDC_TREE1);
……
TV_ITEM tvItem;
TV_INSERTSTRUCT tvInsert;
tvItem.mask = TVIF_TEXT; // 指定pszText成员可用
tvItem.pszText = "Item0"; // 根项目显示的字符
tvInsert.hParent = TVI_ROOT; // 指定父句柄
tvInsert.item = tvItem; // 指定TV_ITEM结构对象
tvInsert.hInsertAfter = TVI_LAST; // 项目插入方式
// 创建根项目,当前项目句柄保存于hItem0中
HTREEITEM hItem0 = m_ctrTreeCtrl.InsertItem(&tvInsert);
……
// 在根项目下继续创建第二层项目
tvItem.mask = TVIF_TEXT;
tvItem.pszText = "SubItem0";
tvInsert.hParent = hItem0;
tvInsert.item = tvItem;
tvInsert.hInsertAfter = TVI_LAST;
HTREEITEM hItem3 = m_ctrTreeCtrl.InsertItem(&tvInsert);

  作为同用户的接口,树形控件将在不同的动作下发出各种通知消息,可以在控件窗口的消息映射中添加ON_NOTIFY_REFLECT宏或是在控件所在父窗口的消息映射中添加ON_NOTIFY宏来为每一个通知消息指定处理函数。

  树形控件中的任何一个项目均可以拥有一个子项目列表,此列表可以随时处于展开或缩起状态。当处于展开状态时,对应的子项目将以缩进方式显示在父项目下;当处于缩起状态时,子项目将不显示。当用户在双击父项目时,相应的子项目列表将自动在展开与缩起状态切换。在子项目列表状态发生改变时和状态改变完成后树形控件将分别发出TVN_ITEMEXPANDING和 TVN_ITEMEXPANDED通知消息。关于其它的通知消息及其具体含义可参见下表:

通知消息 消息说明
TVN_BEGINDRAG 开始拖拽操作
TVN_BEGINLABELEDIT 开始编辑标签
TVN_BEGINRDRAG 开始鼠标右键拖拽操作
TVN_DELETEITEM 删除一个指定的项目
TVN_ENDLABELEDIT 结束编辑标签
TVN_GETDISPINFO 获取一个项目的显示信息
TVN_ITEMEXPANDED 子项目列表被展开或收起
TVN_ITEMEXPANDING 子项目列表正将展开或收起
TVN_KEYDOWN 键盘事件
TVN_SELCHANGED 项目的选择发生改变
TVN_SELCHANGING 项目的选择将要发生改变
TVN_SETDISPINFO 通知更新一个项目的信息
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics