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

支持透明选择矩形的多选树形控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.68/5 (35投票s)

2010年12月29日

CPOL

2分钟阅读

viewsIcon

212408

downloadIcon

8922

一个多选树形控件,基于 Richard 的实现

引言

有时,我们需要一个允许用户一次选择多个项目的树形控件,但标准通用控件并没有提供此功能。感谢Richard Hazlewood 的精彩文章,此功能得到了很好的实现。但是,Richard 的实现只支持简单的橡皮筋式选择。我想要的是一个实现 alpha 混合选择矩形(就像资源管理器一样)的树形控件。

Eugen Podsypalnikov 通过他的CCoverWnd 类给我们提供了一种方法,但是焦点问题和CWnd派生实现让我觉得也许由树形控件本身实现选择绘制会更好,所以这里就有了MFC中的CMultiSelTriCheckTreeCtrl类。

演示项目实际上属于我的另一篇拙作CVComboBox,所以下载链接在这里共享。

如快照所示,树形控件可以为每个项目显示三态复选框,当您单击其中一个复选框时,所有选定的项目都将被选中/取消选中。如果您只想选中/取消选中正在选择的项目,您可以按住控制键的同时单击复选框。

MulSelTree.png

MulSelTree.gif

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类的基本步骤

  1. 创建一个名为CMultiSelTreeDemo的基于对话框的MFC项目。
  2. 将以下源文件(在code_base文件夹下)添加到您的工作区
    • CustomDrawCommon.cpp
    • CustomDrawCommon.h
    • CustomDrawControl.cpp
    • CustomDrawControl.h
    • CustomDrawUtils.cpp
    • CustomDrawUtils.h
  3. 打开预编译头文件,通常是StdAfx.h,在其后追加此行
    #include "..\code_base\CustomDrawCommon.h"
  4. 如果您使用的是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
  5. 使用资源编辑器打开对话框,从控件工具栏将树形控件拖放到对话框中。
  6. 向该树形控件添加相应的控件成员变量,将其命名为m_myTreeCtrl,IDE将为您添加必要的代码,它看起来像这样
    CTreeCtrl m_myTreeCtrl;
  7. 打开对话框类的头文件,将#include指令放在其开头,如下所示
    #include "..\code_base\CustomDrawControl.h"
  8. m_myTreeCtrl的类型从CTreeCtrl重命名为CMultiSelTriCheckTreeCtrl

历史

  • 2010-12-29:初始发布
© . All rights reserved.