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

小气鬼文字控

小气鬼文字控

2016-01-29 12:02

如何在树型控件中使用背景位图,如何在树型控件中使用背景位图
如何在树型控件中使用背景位图
作者: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;}
(完)
展开更多 50%)
分享

猜你喜欢

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

C语言教程 C语言函数
如何在树型控件中使用背景位图

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

C语言教程 C语言函数
如何在EDITBOX控件中使用背景位图

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

如何在ListBox中选择背景位图

C语言教程 C语言函数
如何在ListBox中选择背景位图

如何在严寒中使用相机

拍照 摄影
如何在严寒中使用相机

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何在ASP中使用类

ASP
如何在ASP中使用类

如何在BCB中使用DirectX

编程语言 网络编程
如何在BCB中使用DirectX

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

转CAD图到SolidWorks做三维处理

转CAD图到SolidWorks做三维处理

AutoCAD中块(Block)的应用

AutoCAD中块(Block)的应用
下拉加载更多内容 ↓