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

news/2024/7/5 14:38:37
一、引言:

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

查看本文来源


http://www.niftyadmin.cn/n/3337880.html

相关文章

目前NAXX所用到的一些BUFF和药水

一:药水buff(只罗列了个人认为有用的跟玩家buff不冲突的buff。如果还少什么请大家补充!) 泰坦合剂:使玩家的生命值上限提高1200点,持续2小时.制作需要:格罗姆之血(30) 石鳞鱼油(10) 黑莲花(1) 水晶瓶精练智慧合剂&…

java cache_比较Java中几种数据cache方式 | 学步园

现在很多网站一说到cache就想到memcached,memcached确实是非常优秀的系统,但是在某些场合,特别在不是分布式应用的场合,或者某些数据不需要分布式的访问,那它就未必是最佳的选择。下面比较3种cache方式,用测…

已经有windows再装linux,原有windows,现想再装linux,疑问?

hugogz 于 2009-02-27 17:05:55发表:安装时注意不要选错区就OK了hugogz 于 2009-02-27 17:05:52发表:安装时注意不要选错区就OK了三叶草 于 2009-02-27 12:41:01发表:你要是装LINUX的话,先把要装的空间留出来分为LINUX分区就可以装了li659258510 于 2009-02-27 03:1…

生产模块学习笔记(一)

原来的想法是能深入了解ERP中的一个模块,做得专一些,认真分析一下代码.现在看来这种想法是不可取的,ERP是个系统的工程,断章取义地弄一个模块会有一种瞎子摸象的感觉.在财务和物流模块了解一点后,轮到生产模块了.各个企业真正有个性的地方体现在生产,财务国家国家有统一的制度,…

java的linkedlist_JAVA LinkedList和ArrayList的使用及性能分析

第1部分 List概括List的框架图List 是一个接口,它继承于Collection的接口。它代表着有序的队列。AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。AbstractSequentialList 是…

c语言能够编出功能复杂的程序,c语言实习心得(8页)-原创力文档

第第 PAGE 1 页 共 NUMPAGES 1 页c语言实习心得C语言是一种计算机程序设计语言,属高级语言范畴。它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言&#x…

Ubuntu 使用经验

2019独角兽企业重金招聘Python工程师标准>>> 这是我在Ubuntu 上写的第一篇博客,折腾两三个星期的时间,总结出来一点经验,喜欢的朋友支持下。 首先使用软碟通刻录Ubuntu U盘启动盘, http://jingyan.baidu.com/article/1…

IT外包三个阶段九项注意

IT外包项目动辄涉及数百万美元,公司往往还希望通过外包能带来管理和投资方面的改变。所以落实各种办法,解决各种外包过程中产生的问题极为重要。 但是,IT决策人在处理整个外包项目过程中真正需要的不仅仅是较好的区分轻重缓急的能力&#xff…