Coding Life

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

本文作者:yonken (http://www.cnblogs.com/yonken/)

这篇文章同时被发表在 http://www.codeproject.com/KB/tree/Multi_select_tree_control.aspx

 

其实在CodeGuru 上可以搜到好几个支持多选的tree control,其中Richard Hazlewood的实现比较好些,不过由于他的选择框是简单的点线框,感觉不是非常好看,我希望可以实现资源管理器中的list control的那种蓝色透明选择框。

 

在 CodeProject 上其实有位叫Eugen Podsypalnikov的人写了个 CCoverWnd 类,他是通过一个带WS_EX_LAYERED风格的窗口来实现的,虽然这样比较容易重用,不过会出现焦点变化的问题,所以我放弃使用这个类。

 

最终我还是决定在 Richard Hazlewood 实现的基础上修改drawing的代码,实现出来的效果如下:

 

CMultiSelTriCheckTreeCtrl 是一个基于 MFC 的多选树形控件的封装,它从另外一个实现三态复选框的 MFC 树形控件类 CTriCheckStateTreeCtrl 继承下来。

由于我并没有作很大的改动,因此这个类提供的接口基本和原有的一致:

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;

 

 

要使用这个类,必须将下列文件加入工程:

  • CustomDrawCommon.cpp
  • CustomDrawCommon.h
  • CustomDrawControl.cpp
  • CustomDrawControl.h
  • CustomDrawUtils.cpp
  • CustomDrawUtils.h

然后在stdafx.h里面加入下面这一行:

#include "..\code_base\CustomDrawCommon.h"

 

接下来的事情就按正常的步骤了,首先打开资源编辑器,在对话框上添加一个树形控件,然后绑定一个控件变量,比如:

CTreeCtrl m_myTreeCtrl;

 

然后在对话框类的头文件上#include下述头文件:

#include "..\code_base\CustomDrawControl.h"

最后把 m_myTreeCtrlCTreeCtrl 改为 CMultiSelTriCheckTreeCtrl,大功告成!

 

 

posted on 2010-12-30 10:09  yonken  阅读(4193)  评论(11编辑  收藏  举报