注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一江春水向西流

程序人生

 
 
 

日志

 
 
关于我

夫君子之行,静以修身,俭以养德.非澹泊无以明志, 非宁静无以致远.夫学须静也,才须学也,非学无以广才,非志无以成学,淫漫则不能励精,险躁则不能治性,年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及!

网易考拉推荐

用VC实现在TreeView中使用背景位图  

2009-06-19 10:37:42|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  一、引言:

  对于TreeView控件的背景位图的实现,目前介绍的文章比较少,有人虽然实现了,但是在点击TREE时,背景闪动比较厉害。本人在参照别人代码的基础上,把它总结一下,同时解决了这个背景闪烁的问题。目前FLASHGET1.3版也实现了TREEVIEW的背景位图。大家可以参照一下。

  本文程序运行效果如下图:

           用VC实现在TreeView中使用背景位图 - cucme - 一江春水向西流

  二、原理:

  因为WINDOWS标准TREEVIEW控件不支持背景位图,所以如果需要设置背景位图就需要先让其在内存CDC对象上对TREEVIEW缺省绘图,然后在选择背景位图,与缺省位图合成,即采用贴图的方式,把标准的TREEVIEW窗口贴在底图上。这个操作在内存中完成。

  同时为了避免闪烁,必须重载OnItemexpanding和OnItemexpanded这两个函数。SetRedraw函数主要保证其不要在子树弹出时重画,而是子树已经扩展后重画。

  三、实现步骤:

  3.1 加入成员函数

BOOL CMyTreeCtrl::SetBKImage(LPCTSTR LpszResource)
{
 if( m_bitmap.m_hObject != NULL )
  m_bitmap.DeleteObject();

 HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
LpszResource, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);

 if( hbmp == NULL )
  return FALSE;

 m_bitmap.Attach( hbmp );
 return TRUE;
}

  3.2 为WM_PAINT加入消息句柄

void CMyTreeCtrl::OnPaint()
{
 CPaintDC dc(this); // device context for painting

 CRect rcclient;
 GetClientRect(&rcclient);

 // create a compatible memory dc
 CDC memdc;
 memdc.CreateCompatibleDC(&dc);
 CBitmap bitmap;
 bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
 memdc.SelectObject( &bitmap );
 DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);

 CDC maskdc;
 maskdc.CreateCompatibleDC(&dc);
 CBitmap maskbitmap;
 maskbitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
 maskdc.SelectObject( &maskbitmap );
 CBrush brush;
 brush.CreatePatternBrush(&m_bitmap);
 maskdc.FillRect(rcclient, &brush);
 maskdc.BitBlt(0,0,rcclient.Width(), rcclient.Height(),&memdc,0,0,SRCAND);

 dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
 &maskdc,rcclient.left, rcclient.top,SRCCOPY);
}


  3.3 处理

tvn_itemexpanding void CMyTreeCtrl::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
SetRedraw(FALSE);
*pResult = 0;
}

  3.4 处理

tvn_itemexpanded void CMyTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult)
{
 NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
 Invalidate();
 SetRedraw(TRUE);
 *pResult = 0;
}

  3.5 加入WM_ERASEBKGND消息处理函数

  既然我们在OnPaint()函数中处理位图并返回TRUE以保证默认的窗口进程不擦除背景,加入这个消息句柄可以避免额外的对客户区的刷新以减少闪烁。

BOOL CMyTreeCtrl::OnEraseBkgnd(CDC* pDC)
{
 return TRUE;
}

  评论这张
 
阅读(329)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017