如何在树型控件中使用背景位图

翻译|其它|编辑:郝浩|2007-08-23 09:54:33.000|阅读 892 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

一、引言:

对于  TREWVIEW  控件的背景位图的实现,目前介绍的文章比较少,有人虽然实现了,但是在点击  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);
               CRect rcclient;
               GetClientRect(&rcclient);
               CDC memdc;
               memdc.CreateCompatibleDC(&dc);
               CBitmap bitmap;
               bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height()); 
               memdc.SelectObject( &bitmap );
               CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);
               CDC maskdc;
               maskdc.CreateCompatibleDC(&dc);
               CBitmap maskbitmap;
               maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL); 
               maskdc.SelectObject( &maskbitmap );  maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), 
&memdc, rcclient.left, rcclient.top, SRCCOPY);
               CBrush brush;
               brush.CreatePatternBrush(&m_bitmap);
               dc.FillRect(rcclient, &brush);          
               memdc.SetBkColor(RGB(0,0,0));  
               memdc.SetTextColor(RGB(255,255,255));
               memdc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), 
rcclient.Height(), &maskdc, rcclient.left, rcclient.top, SRCAND); 
               dc.SetBkColor(RGB(255,255,255));
               dc.SetTextColor(RGB(0,0,0)); 
               dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
&maskdc, rcclient.left, rcclient.top, SRCAND);
               dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
&memdc, rcclient.left, rcclient.top,SRCPAINT);
               brush.DeleteObject();}

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;
 
OnPaint()函数改进如下,效果比原来好,代码更简单。

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);
}

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP