CTreeCtrl重载类

 因为公司项目需要,对CTreeCtrl类进行了重载。效果如图

 

代码如下:

#pragma once
#include "afxcmn.h"

class COwnerDrawTree :
 public CTreeCtrl
{
public:
 COwnerDrawTree(void);
 ~COwnerDrawTree(void);

 void DrawItems( CDC* pDC );
protected:
 DECLARE_MESSAGE_MAP()
 afx_msg void OnPaint();
 afx_msg void OnNMClick(NMHDR *pNMHDR, LRESULT *pResult);

private:
 CBitmap  m_bmpParentItem;
};

 

#include "StdAfx.h"
#include "OwnerDrawTree.h"
#include "Resource.h"

COwnerDrawTree::COwnerDrawTree(void)
{
 m_bmpParentItem.LoadBitmap(IDB_BITMAP1);
}

COwnerDrawTree::~COwnerDrawTree(void)
{
 m_bmpParentItem.DeleteObject();
}

BEGIN_MESSAGE_MAP(COwnerDrawTree, CTreeCtrl)
 ON_WM_PAINT()
 ON_NOTIFY_REFLECT(NM_CLICK, &COwnerDrawTree::OnNMClick)
END_MESSAGE_MAP()

void COwnerDrawTree::OnPaint()
{
 CPaintDC dc(this);
 CDC memDC;
 CBitmap bm_ff; 
 CBitmap *bm_old;
 CFont *font, *old_font;
 CFont fontDC;
 int old_mode;

 CRect rcClient;
 GetClientRect(&rcClient);
 memDC.CreateCompatibleDC( &dc );
 bm_ff.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
 // Select the bitmap into the off-screen DC.
 bm_old = (CBitmap *)memDC.SelectObject( &bm_ff );
 CBrush bshTmp(RGB(255,255,255));
 memDC.FillRect(&rcClient, &bshTmp);
 font = GetFont();
 old_font = memDC.SelectObject( font );
 // We're going to draw text transparently
 old_mode = memDC.SetBkMode( TRANSPARENT );


 DrawItems( &memDC );
 dc.BitBlt( 0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);

 memDC.SelectObject( old_font );
 memDC.SetBkMode( old_mode );
 memDC.SelectObject( bm_old );
}

void COwnerDrawTree::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
 // TODO: Add your control notification handler code here

 HTREEITEM hItem = GetSelectedItem();
 TRACE(L"%d/n", hItem);

 *pResult = 0;
}

void COwnerDrawTree::DrawItems( CDC* pDC )
{
 HTREEITEM hItem = GetFirstVisibleItem();
 if ( hItem == NULL )
  return;

 do
 {
  CRect rcClient;
  CRect rcItem;
  CRect rcText;
  GetClientRect(&rcClient);
  GetItemRect(hItem, rcItem, TRUE);
  rcText = rcItem;

  // draw group background
  HTREEITEM hParent = GetParentItem(hItem);
  if (hParent == NULL)
  {
   CDC memDC;
   memDC.CreateCompatibleDC(pDC);
   CBitmap *pbmpOld = memDC.SelectObject(&m_bmpParentItem);
   pDC->StretchBlt(0, rcItem.top, rcClient.Width(), rcItem.Height(), &memDC, 0, 0, 4, 24, SRCCOPY);
   memDC.SelectObject(pbmpOld);

   // icon
   UINT uState = GetItemState(hItem, TVIS_EXPANDED);
   if ((uState & TVIS_EXPANDED) == TVIS_EXPANDED)
   {
    //::DrawIconEx(pDC->GetSafeHdc(), rcText.left + 10, rcItem.top+4, m_hExpandIcon, m_sizeExpand.cx, m_sizeExpand.cy, 0, 0, DI_NORMAL);
   }
   else
   {
    //::DrawIconEx(pDC->GetSafeHdc(), rcText.left + 10, rcItem.top+4, m_hCollapseIcon, m_sizeExpand.cx, m_sizeExpand.cy, 0, 0, DI_NORMAL);
   }
   rcText = rcItem;
   rcText.left += 30;
  }
  else
  {
   // draw selected item.
   UINT nState = GetItemState(hItem, TVIS_SELECTED);
   if (TVIS_SELECTED & nState)
   {
    CRect rcItemTmp = rcItem;
    rcItemTmp.left = 0;
    rcItemTmp.right = rcClient.right;
    pDC->FillSolidRect(rcItemTmp, RGB(127,0,127));
   }
  }

  // Draw image
  int nImage = -1;
  int nSelectedImage = -1;
  BOOL bRet = GetItemImage(hItem, nImage, nSelectedImage);
  CImageList *pImgList = GetImageList(TVSIL_NORMAL);
  if (bRet && pImgList!=NULL)
  {
   IMAGEINFO ii;
   pImgList->GetImageInfo(nImage, &ii);
   CRect rcImage = ii.rcImage;

   CRect rcItem;
   GetItemRect(hItem, rcItem, FALSE);
   int nImageTop = max(rcItem.top, rcItem.top + (rcItem.Height()-rcImage.Height()) / 2);

   pImgList->Draw(pDC, nImage, CPoint(rcText.left - rcImage.Width()-2, nImageTop), ILD_TRANSPARENT);
  }

  // Draw text
 /* CFont *pFontOld = NULL;
  if (hParent == NULL)
  {
   CFont *pFontD = NULL;
   GetTextFont(NULL, &pFontD);
   pFontOld = pDC->SelectObject(pFontD);
  }
  else
  {
   CFont *pFontN = NULL;
   GetTextFont(&pFontN, NULL);
   pFontOld = pDC->SelectObject(pFontN);
  }*/

  rcText.right = rcClient.right;
  pDC->SetBkMode(TRANSPARENT);
  CString strText = GetItemText(hItem);
  pDC->DrawText(strText, rcText, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_VCENTER);
  //pDC->SelectObject(pFontOld);
 } while ( (hItem = GetNextVisibleItem(hItem)) != NULL );
}

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如需要源代码,请发邮件给我。动态中提供获取作者的Email接口函数 public: //功能:获取作者邮箱 //输入:无 //输出:无 //返回:作者信息 CString GetAutherEmail(); //功能:判断输入的节点句柄是否存在 //参数:[in] hItem 节点句柄 //返回:true节点存在,false节点不存在 bool FindItemExist(HTREEITEM hItem); //功能:设置一个节点字体颜色 //参数:[in] hItem 节点句柄 // [in] clrText 节点字体颜色 //返回:true设置字体颜色成功,false设置字体颜色失败 //注:内部不包含刷新 bool SetItemTextColor(HTREEITEM hItem, COLORREF clrText); //功能:获取一个节点字体颜色 //参数:[in] hItem 节点句柄 // [out] clrText 节点字体颜色 //返回:true获取字体颜色成功,false获取字体颜色失败 //注:内部不包含刷新 bool GetItemTextColor(HTREEITEM hItem, COLORREF &clrText;); //功能:设置扩展按钮的边框颜色 //参数:[in] clrButtonBorder 扩展按钮的边框颜色 //返回:无 //注:内部包含刷新 void SetExpandedButtonBorder(COLORREF clrButtonBorder); //功能:设置扩展按钮的十字颜色 //参数:[in] clrButtonCross 扩展按钮的十字颜色 //返回:无 //注:内部包含刷新 void SetExpandedButtonCross(COLORREF clrButtonCross); //功能:刷新背景 //输入:无 //输出:无 void RedrawTreeCtrl(); //功能:设置画线的样式 //输入:[in] nPenStyle 画线样式 // [in] nWidth 画线宽度 // [in] crColor 画线颜色 //返回:无 //注:内部包含刷新 void SetPenLineStyle(int nPenStyle, int nWidth, COLORREF crColor); protected: //功能:判断输入的节点句柄是否存在 //参数:[in] hItem 节点句柄 //返回:true节点存在,false节点不存在 bool FindChildItemExist(HTREEITEM hParantItem, HTREEITEM hItem); //功能:绘制文字 //参数:[in] pDC 设备DC //返回:无 void OnDrawText(CDC *pDC); //功能:绘制一个节点文字 //参数:[in] pDC 设备DC // [in] hItem 节点句柄 //返回:true成功,false失败 bool OnDrawItemText(CDC *pDC, HTREEITEM hItem); //功能:绘制展开按钮 //参数:[in] pDC 设备DC //返回:无 void OnDrawButton(CDC *pDC); //功能:绘制一个节点展开按钮 //参数:[in] pDC 设备DC // [in] hItem 节点句柄 //返回:true成功,false失败 bool OnDrawItemButton(CDC *pDC, HTREEITEM hItem); //功能:绘制一个节点展开按钮(节点展开) //参数:[in] pDC 设备DC // [in] hItem 节点句柄 //返回:true成功,false失败 bool OnDrawItemButtonExpanded(CDC *pDC, HTREEITEM hItem); //功能:绘制一个节点展开按钮(节点未展开) //参数:[in] pDC 设备DC // [in] hItem 节点句柄 //返回:true成功,false失败 bool OnDrawItemButtonNotExpanded(CDC *pDC, HTREEITEM hItem); //功能:绘制节点连接线 //参数:[in] pDC 设备DC //返回:无 void OnDrawLines(CDC *pDC); //功能:绘制根节点连接线 //参数:[in] pDC 设备DC //返回:无 void OnDrawItemLines(CDC *pDC, HTREEITEM hItem); private: //功能:获取画线的区域(排除扩展按钮的区域) //参数:无 //返回:创建的画线的区域 void CreateRgnForDrawLines(CRgn &rgnDraw;);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值