类似QQ游戏大厅导航的树型控件
来源:优易学  2011-1-13 13:04:38   【优易学:中国教育考试门户网】   资料下载   IT书店
  在最近的项目中,需要实现一个类似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
  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);

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训