CQuadStateTree类详解

在标准的CTreeCtrl控件中,经常需要一些额外的特性,比如复选框的不确定状态、自动设置父项和子项的状态、以及通知机制等。CQuadStateTree类正是为了满足这些需求而设计的。

CQuadStateTree类的核心思想是“四态复选框”,即每个复选框可以有四种状态:未选中、选中、不确定以及无复选框。这种设计允许更灵活地控制树形控件中复选框的状态。

为什么称之为“四态”?因为在CQuadStateTree中,每个复选框都有四种可能的状态。除了基本的选中和未选中状态,还有不确定状态。此外,还增加了一个“无”状态,用于表示某个树形控件项没有复选框。

为了使“无”状态有意义,必须有一个基本的限制:如果一个树形控件项要处于“无”状态,那么它的所有父项,一直到根节点,也必须处于“无”状态。这样设计是为了避免在父项可以选择的情况下,子项却无法选择。

使用代码

要在自己的项目中使用CQuadStateTree,首先需要将QuadStateTree.h和QuadStateTree.cpp文件添加到项目中。然后在需要访问CQuadStateTree类的文件中包含QuadStateTree.h头文件。

由于CQuadStateTree是从CTreeCtrl派生的,所以可以像使用CTreeCtrl一样使用这个类,但有一些API的例外。

CQuadStateTree数据类型

CQuadStateTree使用以下自定义数据类型:

enum TVCS_CHECKSTATE { TVCS_NONE = -1, TVCS_UNCHECKED = 0, TVCS_CHECKED = 1, TVCS_INDETERMINATE = 2 };

TVCS_NONE表示树形控件项没有复选框。TVCS_UNCHECKED表示复选框没有勾选标记。TVCS_CHECKED表示复选框有勾选标记。TVCS_INDETERMINATE表示树形控件项有子项,且子项的状态是混合的。

NMTVNCHECK结构

NMTVNCHECK结构包含有关树形控件项复选框状态变化的信息。

typedef struct tagTVNCHECK { NMHDR hdr; HTREEITEM hTreeItem; LPARAM lParam; TVCS_CHECKSTATE OldCheckState; TVCS_CHECKSTATE NewCheckState; HTREEITEM TriggerItem; } NMTVNCHECK, *LPNMTVNCHECK;

hdr是一个包含TVN_CHECK通知消息信息的NMHDR结构。hTreeItem是树形控件项的句柄,其复选框状态正在改变。lParam是与hTreeItem关联的应用程序特定数据。OldCheckState是hTreeItem的旧复选框状态。NewCheckState是hTreeItem的新复选框状态。TriggerItem是用户切换或在调用SetCheck()时指定的树形控件项的句柄。

CQuadStateTree通知消息

TVN_CHECK通知代码用于在复选框即将改变状态时,将TVN_CHECK通知发送给父窗口。

TVN_CHECK pNMTvnCheck = (LPNMTVNCHECK) lParam;

如果NMTVNCHECK结构的hTreeItem和TriggerItem成员指向同一个树形控件项,则返回非零值将阻止树形控件项复选框状态的改变。在所有其他情况下,返回值将被忽略。

ON_TVN_CHECK消息映射宏

使用ON_TVN_CHECK宏定义TVN_CHECK通知处理函数。

ON_TVN_CHECK(nID, pFunction)

nID是树形控件的标识号,pFunction是当TVN_CHECK通知发送时要调用的成员函数的指针。

CQuadStateTree成员函数

CQuadStateTree类提供了一些成员函数,用于创建和操作树形控件。

构造函数,用于构造CQuadStateTree对象。

析构函数,用于删除CQuadStateTree对象。

GetCheck函数用于检索树形控件项的复选框状态。

TVCS_CHECKSTATE GetCheck(HTREEITEM hTreeItem) const;

hTreeItem是要检索复选框状态的树形控件项的句柄。函数返回一个TVCS_CHECKSTATE枚举,指示复选框的当前状态。

SetCheck函数用于更改树形控件项的复选框状态。

BOOL SetCheck(HTREEITEM hTreeItem, TVCS_CHECKSTATE NewCheckState = TVCS_CHECKED);

hTreeItem是要接收复选框状态更改的树形控件项的句柄。NewCheckState是新的复选框状态,默认设置为TVCS_CHECKED。函数返回非零值表示成功,否则返回零。

Create函数用于创建控件(子窗口)并将其与CQuadStateTree对象关联。

virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

dwStyle指定树形视图控件的样式。rect是一个RECT结构的引用,描述要创建的窗口的大小和位置,以pParentWnd的客户坐标为单位。pParentWnd是控件的父窗口的指针。nID是控件的子窗口ID。

CreateEx函数用于创建控件(子窗口)并将其与CQuadStateTree对象关联。

virtual BOOL CreateEx(DWORD dwExStyle, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

dwExStyle指定要创建的控件的扩展样式。dwStyle指定树形视图控件的样式。rect是一个RECT结构的引用,描述要创建的窗口的大小和位置,以pParentWnd的客户坐标为单位。pParentWnd是控件的父窗口的指针。nID是控件的子窗口ID。

从CQuadStateTree派生

CQuadStateTree需要处理几种不同的消息才能正常工作。如果从CQuadStateTree派生出自己的控件,并在派生类中处理相同的消息,请确保在消息处理函数中调用CQuadStateTree的消息处理函数。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485