65.9K
CodeProject 正在变化。 阅读更多。
Home

树形列表控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (18投票s)

1999 年 12 月 2 日

3分钟阅读

viewsIcon

417542

downloadIcon

11429

树控件/列表控件的混合

Sample Image - treelist.jpg

Treelist 控件是源自 CTreeCtrl 的树/列表组合控件。

以下是所用类的描述

  • CTLFrame - 源自 CWnd,此类是 treelist 控件的框架类。 它用于包含标头控件、树本身和水平滚动条。
  • CNewHeaderCtrl - 源自 CHeaderCtrl。 用作 TreeList 中的标头。
  • CNewTreeListCtrl - 源自 CTreeCtrl,用作 TreeList 中的主树。
  • CTLItem - 表示树中的每个项。
  • SSortType - 用于指示树的排序是升序还是降序以及正在排序的列的结构。

如何将 TreeList 插入您的项目?

  1. 将以下文件插入到您的项目中
    • TLFrame.cpp, TLFrame.h
    • NewTreeListCtrl.cpp, NewTreeListCtrl.h
    • NewHeaderCtrl.cpp, NewHeaderCtrl.h
  2. 在应用程序文件(InitInstance 函数所在的位置)中包含文件 "TLFrame.h",并在 InitInstance 函数中插入以下行
    ....
    CTLFrame::RegisterClass();
    ....
    
  3. 在对话框中布局一个用户定义的控件,控件应插入其中。 在类字段类型中: "LANTIVTREELISTCTRL"
  4. 在对话框的头文件中包含 "TLFrame.h",并添加一个成员变量: CTLFrame m_wndMyTreeList;
  5. 在您的 OnInitDialog()OnCreate() 函数中,子类化该控件
    ....
    m_wndMyTreeList.SubclassDlgItem(IDC_TREE_LIST, this);
    
    // IDC_TREE_LIST is the ID of the user-defined control you 
    // inserted into the dialog
    ....

就是这样!

使用 TreeListCtrl

控件的使用很简单。 这是一个树,所以把它当做一个树来对待(HTREEITEM 等)。 此外,还有诸如 InsertColumn, SetItemText, SetItemColor, SetItemBold, GetItemText 等函数。

实现

这是我实现 TreeList 的方法。 首先,我必须创建一个框架窗口,它将包含 3 个对象:标头、树和水平滚动条。 这就是 CTLFrame 的用途。 此外,这个派生自 CWnd 的类在滚动过程中有所帮助:标头在重新定位后会被裁剪,因此会有滚动的效果。

创建类 CNewHeaderCtrl 只是为了在其中放置 3D 三角形。 我决定包含排序,因为在 9/10 的情况下都需要它,而且每个程序员都需要自己插入它是一种耻辱。 最后,CNewTreeListCtrl 是更复杂的部分。 树中的每个项都具有与之关联的 DWORD 数据,该数据存储指向 CTLItem 类的指针。 CTLItem 存储有关每个项目的信息 - 其列的字符串、项目是否为粗体、项目的颜色以及用户希望与项目关联的项目数据。 为了使用 CTLItem 技术,所有处理项目的函数,如 InsertItemDeleteItemSetItemText 等都被覆盖。

我在滚动部分遇到了一些困难,因为滚动条有很多不同的条件:垂直滚动条显示,然后水平滚动条变短; 如果它被隐藏,那么水平滚动条应该再次变大; 如果用户更改了某些列的大小会发生什么... 以及诸如此类的问题。 我相信我处理了这些情况中的每一种,所以我认为这部分不会有任何问题。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.