一步一步教你实现CTreeCtrl 自绘

扫描二维码,添加好友,获取更多的斗地主编程技术

一步一步教你实现CTreeCtrl 自绘

文章插图
源代码下载
最近因工作需求,需要自绘 。由于原来从来没有自绘过,开始在网上搜索资料,查询(因此本文有些知识可能不全面,或许还有更好的办法来实现,还请大家多多指教 。)经过一段时间的编写,终于写好了 。在此,感谢网友提供的实例参考 。
先贴上效果图,如果觉得还不错,那就继续往下看吧 。如果觉得不行的,请飘过 。
一步一步教你实现CTreeCtrl 自绘

文章插图
如何你看见这句话我会很高兴,因为至少我写的东西对你还是有一点点的吸引了 。在此谢过!
很好,那现在让我们来说说为什么要自绘 。我总结了以下2点需要自绘的情况 。
1.当系统自带的树形控件已不满足我们的要求时,我们需要自绘 。就像上图一样我们需要在后面显示我们额外的图标 。
2.当你是一个追求界面美观的人时,我们需要自绘
我们需要自绘控件,我们就必须先了解一下自绘的方法,
自绘有2种方法可以实现 。
第一种:通过从写反射消息实现自绘 。
第二种 通过重写实现自绘 。
二种方法都是通过继承类,然后重写虚函数实现 。
下面分别介绍每一种的方法:
第一种:通过从写反射消息实现自绘 。从这个消息的英文单词我们翻译过来就是自定义绘制 。当控件需要绘制就会触发这个消息 。需要注意的是这个函数被调用的时候只是绘制了当前的某一个节点,意思就是当我们的有10个节点需要绘制的时候这个函数就需要调用10次 。
这个是函数原型
::(NMHDR*,*)
这个函数会给我们传入一个指针,这个指针有我们很关心的数据,如当前的HDC,RECT,和当前的节点信息,但是必须要通过转换 。下面是转换语句 。
*=( *)
可能有的朋友会问为什么需要类型转换了,这是由于在我们的程序中收到消息的不止一个,其它的控件也能收到,这里我们我为了区分是哪个控件收到的消息所以我们需要对应的类型转换 。下面是常见控件的类型转换类型 。
List view
Tree view
All other
很明显我们根据上面的图一眼就能看出对应的类型是 。
下面我们在来看看我们最关心的 结构里面存的是什么数据 。
结构定义:
{
nmcd;//包含控件的基本信息(见下表)
;//节点的文本颜色
;//文本背景色
}, *;
结构定义:
{
NMHDR hdr;//跟一样,我基本没用到
DWORD ;//绘画段,某项被檫出前,后,绘制前,后
HDC hdc;//控件的设备上下文句柄
RECT rc;//要绘制的区域
DWORD ;//树控件不需要这个变量
UINT ;//项的状态,只要是点击选中
//项关联的数据,通过函数设置的 。
}, FAR* ;
项的状态(来自MSDN)
theitem state. It can be aof the.
Value
The item is . 项被核记了
The item is in itsstate. 默认状态
The item is . 项被禁止了
The item is in focus. 项具有焦点
The item is . 项为灰颜色,
The item isunder the(hot). 鼠标当前停留在这个项上
一步一步教你实现CTreeCtrl 自绘

文章插图
The item is . 项被选中了
以上就是我们自绘需要知道的数据结构,如果你了解这些数据结构所代表的意思,那下面我们就可以开始绘制了 。
绘制方法
消息自绘,使你可以决定在什么绘画端(就是中的DWORD )来绘制,比较常用的是在绘制前的阶段来绘制,如果你只是用了这种方法来绘制画,那么恭喜你选择对了一半,但是绘制失败了,因为你将什么也看不见 。不急,让我们慢慢给你说明原因,因为你在绘制前的阶段绘制了,紧接这系统还会调用一次默认绘制,那么你原来的绘制就被覆盖了 。