CTreeCtrl——类似QQ游戏大厅导航的树型控件

转载:http://www.vckbase.com/index.php/wv/1543.html

http://code.it168.com/v/treeviewkongjian/TreeCtrlBT.cpp

随着软件界面越来越花俏,windows标准常用控件难以满足实际项目的需求。在最近的项目中,需要实现一个类似QQ游戏大厅导航树型控件。参考了网络上的部分资料,自己动手制作了一个类CTreeCtrlBT。其界面如下:

CTreeCtrl——类似QQ游戏大厅导航的树型控件_第1张图片

实现步骤

第一步:新建一个基于对话框的MFC工程,拖动一棵标准树型控件放于界面之上。添加一个新类CTreeCtrlBT派生自CTreeCtrl。

第二步:为该类添加一些消息响应以及虚函数。其详细作用如下:

1. void PreSubclassWindow(); //用于添加初始化控件的相关信息
2. WM_SIZE //控件区域发生变化时候的处理
3. WM_PAINT //绘制控件
4. WM_MOUSEMOVE //主要获取鼠标所在位置的单元项
第三步:TreeCtrlBT.h中首先声明一个结构用于保存单元项的相关信息,并把所有项的信息放入一个map。实现代码如下:

typedef struct tagItemMsg

{

HTREEITEM hItem;            //项的句柄

CBitmap   ItemBitmap;       //项的位图

COLORREF  crTransparent;    //透明颜色

tagItemMsg()

{

hItem   = NULL;

crTransparent = RGB(255,255,255);

}

~tagItemMsg()

{

if ( ItemBitmap.GetSafeHandle() )

{

ItemBitmap.DeleteObject();

}


}ITEM_MSG;

typedef map ITEMMSG_MAP;

第四步:计算控件的客户区域大小,以及滚动条滚动的偏移量。详细过程参考源代码

Calculate函数。

第五步:添加接口函数以及成员变量。如下:

(注意:TransparentBlt函数,需要包含msimg32.dll)


01. //设置背景位图
02. BOOL SetBackgroudBitmap( UINT nID );
03. BOOL SetBackgroudBitmap(LPCTSTR lpszRecourceName);
04. //设置某一项位图
05. void SetItemBitmap(HTREEITEM hItem, UINT nIdBitmap);
06. void SetItemBitmap(HTREEITEM hItem, LPCTSTR lpszBitmap);
07. //设置展开收缩的图表
08. void SetExpandBitmap(UINT nIdExpand, UINT nIdCollapse, COLORREF crTransparent = RGB(255,255,255));
09. //插入新的项目
10. HTREEITEM InsertItemEx(HTREEITEM hParent, LPCTSTR lpszItem, UINT nIdBitmap = 0,
11. OLORREF crTransparent = RGB(255,255,255));
12. HTREEITEM InsertItemEx(HTREEITEM hParent, LPCTSTR lpszItem, LPCTSTR lpszBitmap,
13. COLORREF crTransparent = RGB(255,255,255));
14. //开启横线
15. void EnableRowLine( BOOL bEnable = TRUE );
16. //是否开启横线
17. BOOL IsEnableRowLine();
18. //开启根节点背景
19. void EnableRootBk( BOOL bEnable = TRUE );
20. //是否开启根节点背景
21. BOOL IsEnableRootBk();
22. //获取某一项信息
23. ITEM_MSG* GetItemMsg(HTREEITEM hItem);第六步:绘制控件。需要的绘制函数如下:
01.//绘制渐变色矩形区域

void GradientFillRect( CDC *pDC, CRect &rect, COLORREF col_from, COLORREFcol_to, bool vert_grad );

//绘制控件背景
05. void DrawBackgroudBitmap(CDC* pDc);
06.  
07. //绘制单元项
08. void DrawItem( CDC* pDC );
09.  
10. //绘制单元项下部横线
11. void DrawRowLine(CPoint ptBegin, CPoint ptEnd, CDC *pDc = NULL);
12.  
13. //绘制展开收缩按钮
14. void DrawExpand(CRect rect, int state, CDC *pDc = NULL);
15.  
16. //绘制单元项位图
17. void DrawItemBitmap(CRect rect, HTREEITEM hItem, CDC *pDc = NULL);
18.  
19. //绘制单元项目文本
20. void DrawItemText(CRect rect, HTREEITEM hItem, bool bselected,CDC *pDc = NULL);

结束语

初次发表文章,表达不够详细的地方,望多多谅解,详细过程请参考源代码。在制作本控件时候,参考了类VividTree的部分代码,其地址如下:

http://www.codeproject.com/KB/tree/VividTree.aspx

如果你有对本代码有声明建议或者意见可以联系本人,非常期待交往你这个朋友。

QQ:182408087

MSN:[email protected]



你可能感兴趣的:(CTreeCtrl——类似QQ游戏大厅导航的树型控件)