当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 如何在树型控件中使用背景位图

VC++
如何隐藏显示在任务栏中的对话框程序
一个效果很好的outlookbar控件CXTOutBarCtrl
如何在对话框程序中使用动画控件
形态各异的不规则窗体
支持换肤功能的窗口实例
如何给基于对话框的应用加启动画面
Convert CHtmlView to CHtmlCtrl(View与Frame的分离)
《Windows 程序设计》学习笔记(四)
如何模拟《WORD》的窗口形式
如何按非客户区移动窗体
仿制金山毒霸专杀工具界面
在对话框程序中插入DialogBar
接触VC之三:MFC基于对话框程序
无标题栏对话框的拖动
MFC框架程序中全屏显示特性的实现
给你的应用程序添加动态鼠标
在MFC程序中添加全屏显示功能
制作类似网络蚂蚁的拉帘式Tab
如何有效的使用对话框之二
IE控制条的实现

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 96 ::
收藏到网摘: n/a

如何在树型控件中使用背景位图
作者:zhoudb
下载本文源代码

一、引言:
对于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;}
(完)