WEB开发网
开发学院软件开发VC 如何在树型控件中使用背景位图 阅读

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

 2010-07-06 20:44:03 来源:WEB开发网   
核心提示:一、引言:对于TREWVIEW控件的背景位图的实现,目前介绍的文章比较少,如何在树型控件中使用背景位图,有人虽然实现了,但是在点击TREE时,必须重载OnItemexpanding和OnItemexpanded这两个函数,SetRedraw函数主要保证其不要在子树弹出时重画,背景闪动比较厉害,本人在参照别人代码的基础上

一、引言:

对于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();
}

1 2  下一页

Tags:如何 控件 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接