游戏开发论坛

 找回密码
 立即注册
搜索
查看: 985|回复: 0

类似QQ游戏大厅导航的树型控件 wxh zt

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2009-1-11 17:24:00 | 显示全部楼层 |阅读模式
作者:方建君

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

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

第二步:为该类添加一些消息响应以及虚函数。其详细作用如下:
void PreSubclassWindow(); //用于添加初始化控件的相关信息
WM_SIZE //控件区域发生变化时候的处理
WM_PAINT //绘制控件
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<HTREEITEM,ITEM_MSG*>        ITEMMSG_MAP;

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

第五步:添加接口函数以及成员变量。如下:
(注意:TransparentBlt函数,需要包含msimg32.dll)


//设置背景位图BOOL SetBackgroudBitmap( UINT nID );BOOL SetBackgroudBitmap(LPCTSTR lpszRecourceName);//设置某一项位图void SetItemBitmap(HTREEITEM hItem, UINT nIdBitmap);void SetItemBitmap(HTREEITEM hItem, LPCTSTR lpszBitmap);//设置展开收缩的图表void SetExpandBitmap(UINT nIdExpand, UINT nIdCollapse, COLORREF crTransparent = RGB(255,255,255));//插入新的项目HTREEITEM InsertItemEx(HTREEITEM hParent, LPCTSTR lpszItem, UINT nIdBitmap = 0,
                        OLORREF crTransparent = RGB(255,255,255));HTREEITEM InsertItemEx(HTREEITEM hParent, LPCTSTR lpszItem, LPCTSTR lpszBitmap,
                        COLORREF crTransparent = RGB(255,255,255));//开启横线void EnableRowLine( BOOL bEnable = TRUE );//是否开启横线BOOL IsEnableRowLine();//开启根节点背景void EnableRootBk( BOOL bEnable = TRUE );//是否开启根节点背景BOOL IsEnableRootBk();//获取某一项信息ITEM_MSG* GetItemMsg(HTREEITEM hItem);

第六步:绘制控件。需要的绘制函数如下:


//绘制渐变色矩形区域void GradientFillRect( CDC *pDC, CRect &rect, COLORREF col_from, COLORREF col_to, bool vert_grad );
//绘制控件背景void DrawBackgroudBitmap(CDC* pDc);
//绘制单元项void DrawItem( CDC* pDC );
//绘制单元项下部横线void DrawRowLine(CPoint ptBegin, CPoint ptEnd, CDC *pDc = NULL);
//绘制展开收缩按钮void DrawExpand(CRect rect, int state, CDC *pDc = NULL);
//绘制单元项位图void DrawItemBitmap(CRect rect, HTREEITEM hItem, CDC *pDc = NULL);
//绘制单元项目文本void DrawItemText(CRect rect, HTREEITEM hItem, bool bselected,CDC *pDc = NULL);
  

结束语
初次发表文章,表达不够详细的地方,望多多谅解,详细过程请参考源代码。在制作本控件时候,参考了类VividTree的部分代码,其地址如下:
http://www.codeproject.com/KB/tree/VividTree.aspx
  
如果你有对本代码有声明建议或者意见可以联系本人,非常期待交往你这个朋友。
QQ:182408087
MSN:xiaofangmsg@hotmail.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 12:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表