一步一步教你实现CTreeCtrl 自绘
-------BY wojiushi3344
QQ:513670524 转载请说明出处
扫描二维码,添加好友,获取更多的斗地主编程技术
最近因工作需求,需要自绘CTreeCtrl。由于原来从来没有自绘过,开始在网上搜索资料,查询(因此本文有些知识可能不全面,或许还有更好的办法来实现,还请大家多多指教。)经过一段时间的编写,终于写好了。在此,感谢网友bunpkin提供的实例参考。
先贴上效果图,如果觉得还不错,那就继续往下看吧。如果觉得不行的,请飘过。
如何你看见这句话我会很高兴,因为至少我写的东西对你还是有一点点的吸引了。在此谢过!
很好,那现在让我们来说说为什么要自绘CTreeCtrl。我总结了以下2点需要自绘的情况。
1.当系统自带的树形控件已不满足我们的要求时,我们需要自绘。就像上图一样我们需要在后面显示我们额外的图标。
2.当你是一个追求界面美观的人时,我们需要自绘
我们需要自绘CTreeCtrl控件,我们就必须先了解一下自绘的方法,
CTreeCtrl自绘有2种方法可以实现。
第一种:通过从写NM_CUSTORMDRAW反射消息实现自绘。
第二种 通过重写 ON_PAINT实现自绘。
二种方法都是通过继承CTreeCtrl类,然后重写虚函数实现。
下面分别介绍每一种的方法:
第一种:通过从写NM_CUSTORMDRAW反射消息实现自绘。从这个消息的英文单词我们翻译过来就是自定义绘制。当CTreeCtrl控件需要绘制就会触发这个消息。需要注意的是这个函数被调用的时候只是绘制了当前的某一个节点,意思就是当我们的CTreeCtrl有10个节点需要绘制的时候这个函数就需要调用10次。
这个是函数原型
void CMyTreeCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
这个函数会给我们传入一个pNMHDR指针,这个指针有我们很关心的数据,如当前的HDC,RECT,和当前的节点信息,但是必须要通过转换。下面是转换语句。
NMTVCUSTOMDRAW *ptvTreeCtrl=(NMTVCUSTOMDRAW *)pNMHDR
可能有的朋友会问为什么需要类型转换了,这是由于在我们的程序中收到NM_CUSTORMDRAW消息的不止CTreeCtrl一个,其它的控件也能收到,这里我们我为了区分是哪个控件收到的消息所以我们需要对应的类型转换。下面是常见控件的类型转换类型。
Control | Structure |
---|---|
List view | NMLVCUSTOMDRAW |
ToolTips | NMTTCUSTOMDRAW |
Tree view | NMTVCUSTOMDRAW |
All ot |