转载:http://www.vckbase.com/index.php/wv/1543.html
http://code.it168.com/v/treeviewkongjian/TreeCtrlBT.cpp
随着软件界面越来越花俏,windows标准常用控件难以满足实际项目的需求。在最近的项目中,需要实现一个类似QQ游戏大厅导航树型控件。参考了网络上的部分资料,自己动手制作了一个类CTreeCtrlBT。其界面如下:
实现步骤
第一步:新建一个基于对话框的MFC工程,拖动一棵标准树型控件放于界面之上。添加一个新类CTreeCtrlBT派生自CTreeCtrl。
第二步:为该类添加一些消息响应以及虚函数。其详细作用如下:
1.
void
PreSubclassWindow();
//用于添加初始化控件的相关信息
2.
WM_SIZE
//控件区域发生变化时候的处理
3.
WM_PAINT
//绘制控件
4.
WM_MOUSEMOVE
//主要获取鼠标所在位置的单元项
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,
COLORREF
col_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