程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 類似QQ游戲大廳導航的樹型控件

類似QQ游戲大廳導航的樹型控件

編輯:關於VC++

在最近的項目中,需要實現一個類似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

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved