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

2016-01-29 12:02 25 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

如何在树型控件中使用背景位图
作者: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;}
(完)

来源:http://www.tulaoshi.com/n/20160129/1484363.html

延伸阅读
一、 为什么写这篇东西 自己在使用 BCB5 写一些程序时需要检查很多东西,例如内存泄漏、资源是否有释放等等,在使用了很多工具后,发觉 BCB5 本身自带的工具—— CodeGuard ,非常不错,使用也挺方便的,但是摸索了很久(以及翻查了一些资料,包括 HELP )才算是会用了。写这篇文章的目的希望有这方面的问题的朋友可以借鉴一下,大家互相学习,...
标签: 电脑入门
目前,使用windows系统的用户占多数,很多人还是比较习惯使用windows系统,我们都知道,使用windows系统可以轻松的使用聊天工具进行聊天,那么在Linux系统下要怎么使用qq等聊天工具聊天呢?下面图老师小编就教你Linux系统下如何使用qq等聊天工具。 windows 中可用 QQ、YY、阿里旺旺等多种聊天软件聊天,那么,在 linux 系统中怎样进行聊天呢?...
标签: 电脑入门
在Linux系统中使用man帮助能够使用man命令对系统进行操作,还能查询一些相关文件,那么man帮助有哪些用法呢?下面图老师小编就给大家介绍下Linux使用man帮助的方法。 使用方法: 1. man的查询后面的数字含义: 1用户在shell换机中可以操作的指令或可执行文件 2系统核心可乎叫的函数与工具 3一些常用的函数(function)与函数库(librar...
树型控件用来显示具有一定层次结构的数据项时方便、直观,被广泛地应用在各种软件中,如资源管理器中的磁盘目录就用的是树型 控件,我们在编程中也会经常用到,但 MFC 中提供的 CTreeCtrl 类并不直接支持拖动节点等高级特性,这使我们程序员编程时有很大限制,又给软件用户带来了一些不便。下面就让我们自己动手来解决这个问题,实现...
标签: SQLServer
懒得翻译原文了,一般在视图中使用Order by是无效的,除非使用了Top关键字,那么我们可以用Top 100 percent来欺骗SQL的语法分析器。 USE pubs GO CREATE VIEW AuthorsByName AS SELECT TOP 100 PERCENT * FROM authors ORDER BY au_lname, au_fname GO

经验教程

76

收藏

12
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部