WEB开发网
开发学院软件开发VC 类似QQ游戏大厅导航的树型控件 阅读

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

 2009-01-12 19:39:37 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 在最近的项目中,需要实现一个类似QQ游戏大厅导航树型控件,类似QQ游戏大厅导航的树型控件,参考了网络上的部分资料,自己动手制作了一个类CTreeCtrlBT,详细过程请参考源代码,在制作本控件时候,其界面如下:实现步骤第一步:新建一个基于对话框的MFC工程,拖动一棵标准树型控件放于界面

本文示例源代码或素材下载

在最近的项目中,需要实现一个类似QQ游戏大厅导航树型控件。参考了网络上的部分资料,自己动手制作了一个类CTreeCtrlBT。其界面如下:

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

实现步骤

第一步:新建一个基于对话框的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

Tags:类似 QQ 游戏

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接