树控件自绘wm_paint消息//只出现GradientFillRect函数效果、树节点的字都没有!

mirroatl139 2012-12-21 04:47:40

void CTreeCtrlEx::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient;
GetClientRect(rcClient); //获取客户区
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
GradientFillRect(memDC.m_hDC,rcClient,0xFDE7C5,0xffffff,false);
memDC.SetBkMode(TRANSPARENT);
memDC.SetTextColor(RGB(0,0,0));
dc.BitBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&memDC,rcClient.left,rcClient.top,SRCCOPY);
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
}

...全文
155 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
看不见的裂痕 2012-12-21
  • 打赏
  • 举报
回复
引用 3 楼 gfm688 的回复:
void CTreeCtrlEx::OnPaint() { CPaintDC dc(this); // device context for painting CRect rcClient; GetClientRect(rcClient); //获取客户区 CDC memDC; memDC.CreateCompatibleDC(&……
这代码不错,但是感觉会闪烁哦。 CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.GetSafeHdc(), 0); 这个是不是应用CTreeCtrlEx的父类更好呢?只是感觉。 最好放到一个内存中同时输出。
gfm688 2012-12-21
  • 打赏
  • 举报
回复
void CTreeCtrlEx::OnPaint() { CPaintDC dc(this); // device context for painting CRect rcClient; GetClientRect(rcClient); //获取客户区 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap bitmap; bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height()); CBitmap* pOldBitmap = memDC.SelectObject(&bitmap); CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.GetSafeHdc(), 0); GradientFillRect(dc.GetSafeHdc(),rcClient,0xFDE7C5,0xffffff,false); COLORREF cr = GetBkColor(); if (cr == -1) cr = GetSysColor(COLOR_WINDOW); ::TransparentBlt(dc.GetSafeHdc(), 0, 0, rrcClient.Width(), rcClient.Height(), memDC.GetSafeHdc(), 0, 0, rcClient.Width(), rcClient.Height(), cr); memDC.SelectObject(pOldBitmap); }
gfm688 2012-12-21
  • 打赏
  • 举报
回复

void CTreeCtrlEx::OnPaint() 
{
  CPaintDC dc(this); // device context for painting
  CRect rcClient;
  GetClientRect(rcClient); //获取客户区
  CDC memDC;
  memDC.CreateCompatibleDC(&dc);
  CBitmap bitmap;
  bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
  CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
  CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.GetSafeHdc(), 0);
  GradientFillRect(dc.GetSafeHdc(),rcClient,0xFDE7C5,0xffffff,false);
  ::TransparentBlt(dc.GetSafeHdc(), 0, 0, rrcClient.Width(), rcClient.Height(), memDC.GetSafeHdc(), 0, 0, rcClient.Width(), rcClient.Height(), GetBkColor());
  memDC.SelectObject(pOldBitmap);
}
看不见的裂痕 2012-12-21
  • 打赏
  • 举报
回复
被楼主覆盖了 在 memDC.SetBkMode(TRANSPARENT); memDC.SetTextColor(RGB(0,0,0)); 之后 使用TextOut再输出一下内容才行
第一步:新建一个基于对话框的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,

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧