Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16498020
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:57:55

下载本文示例代码
  一、引言:  对于TreeView控件的背景位图的实现,目前介绍的文章比较少,有人虽然实现了,但是在点击TREE时,背景闪动比较厉害。本人在参照别人代码的基础上,把它总结一下,同时解决了这个背景闪烁的问题。目前FLASHGET1.3版也实现了TREEVIEW的背景位图。大家可以参照一下。   本文程序运行效果如下图:             二、原理:  因为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;}zmbbs=1;   一、引言:  对于TreeView控件的背景位图的实现,目前介绍的文章比较少,有人虽然实现了,但是在点击TREE时,背景闪动比较厉害。本人在参照别人代码的基础上,把它总结一下,同时解决了这个背景闪烁的问题。目前FLASHGET1.3版也实现了TREEVIEW的背景位图。大家可以参照一下。   本文程序运行效果如下图:             二、原理:  因为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;}zmbbs=1; 下载本文示例代码


用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图用VC实现在TreeView中使用背景位图
阅读(246) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~