支持透明选择矩形的多选树形控件
一个多选树形控件,基于 Richard 的实现
引言
有时,我们需要一个允许用户一次选择多个项目的树形控件,但标准通用控件并没有提供此功能。感谢Richard Hazlewood 的精彩文章,此功能得到了很好的实现。但是,Richard 的实现只支持简单的橡皮筋式选择。我想要的是一个实现 alpha 混合选择矩形(就像资源管理器一样)的树形控件。
Eugen Podsypalnikov 通过他的CCoverWnd 类给我们提供了一种方法,但是焦点问题和CWnd
派生实现让我觉得也许由树形控件本身实现选择绘制会更好,所以这里就有了MFC中的CMultiSelTriCheckTreeCtrl
类。
演示项目实际上属于我的另一篇拙作CVComboBox,所以下载链接在这里共享。
如快照所示,树形控件可以为每个项目显示三态复选框,当您单击其中一个复选框时,所有选定的项目都将被选中/取消选中。如果您只想选中/取消选中正在选择的项目,您可以按住控制键的同时单击复选框。
CMultiSelTriCheckTreeCtrl 的接口
CMultiSelTriCheckTreeCtrl
是一个封装多选树形控件的MFC包装类,它派生自另一个名为CTriCheckStateTreeCtrl
的MFC包装类,该类实现了一个三态复选框树形控件。
CMultiSelTriCheckTreeCtrl
的接口与Richard Hazlewood的CMultiTree
非常相似,因为我只是简单地更改了选择绘制代码,以下是public
接口
inline BOOL IsMultiSelectable() const ;
void SetMultiSelectable(BOOL bMultiSel = TRUE);
inline BOOL IsSelected(HTREEITEM hItem) const;
size_t GetSelectedCount() const;
HTREEITEM GetFirstSelectedItem() const;
HTREEITEM GetNextSelectedItem(HTREEITEM hItem) const;
HTREEITEM GetPrevSelectedItem(HTREEITEM hItem) const;
void SelectAll(BOOL bSelect = TRUE);
void SelectRange(HTREEITEM hFirst, HTREEITEM hLast, BOOL bOnly = TRUE);
//Note: not virtual, so must call this class (or derivative)
BOOL SetItemState(HTREEITEM hItem, UINT nState, UINT nStateMask);
UINT GetItemState(HTREEITEM hItem, UINT nStateMask) const;
virtual void ToggleCheckSelectedItem();
virtual void DeleteSelectedItem();
void GetSelectedList(TreeItemList& selectedList) const;
在基于对话框的应用程序中使用CMultiSelTriCheckTreeCtrl 的基本步骤
以下是有关如何使用CMultiSelTriCheckTreeCtrl
类的基本步骤
- 创建一个名为
CMultiSelTreeDemo
的基于对话框的MFC项目。 - 将以下源文件(在code_base文件夹下)添加到您的工作区
- CustomDrawCommon.cpp
- CustomDrawCommon.h
- CustomDrawControl.cpp
- CustomDrawControl.h
- CustomDrawUtils.cpp
- CustomDrawUtils.h
- 打开预编译头文件,通常是StdAfx.h,在其后追加此行
#include "..\code_base\CustomDrawCommon.h"
- 如果您使用的是Visual Studio 6.0,则还需要将这些放在StdAfx.h的开头
#pragma warning(disable: 4786) // try to disable the annoying warning in VC6 #ifndef WINVER #define WINVER 0x0501 #endif // WINVER #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif // _WIN32_WINNT
- 使用资源编辑器打开对话框,从控件工具栏将树形控件拖放到对话框中。
- 向该树形控件添加相应的控件成员变量,将其命名为
m_myTreeCtrl
,IDE将为您添加必要的代码,它看起来像这样CTreeCtrl m_myTreeCtrl;
- 打开对话框类的头文件,将
#include
指令放在其开头,如下所示#include "..\code_base\CustomDrawControl.h"
- 将
m_myTreeCtrl
的类型从CTreeCtrl
重命名为CMultiSelTriCheckTreeCtrl
。
历史
- 2010-12-29:初始发布