自绘控件时遇到的问题,如CListCtrl
2015-09-29 21:22
267 查看
在自绘CListBox的时候本人遇到过一件很头痛的事情,当然,这点小问题对于大牛来说,压根不屑一顾,可是初学者遇到的话,一时半会还真没什么办法解决。
自绘控件很简单,按照书上的步骤一步一步来操作即可,就拿自绘CListBox为例。
我们从CListBox派生出一个子类CListBoxEx,然后添加DrawItem和MeasureItem函数即可。我不知道有多少人和我一样,喜欢通过机器自动给我们添加。
![](http://img.blog.csdn.net/20150416191053305?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzaHVodWFrYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
机器添加代码之后,我们的类大概就变成了这样子:
![](http://img.blog.csdn.net/20150416191528661?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzaHVodWFrYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
好了,我们姑且在这两个函数里面什么也不干吧!现在我们动态创建一个CListBoxEx控件吧!
![](http://img.blog.csdn.net/20150416192001976?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzaHVodWFrYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
现在可以启动程序了,是不是一启动就报错呢?
![](http://img.blog.csdn.net/20150416192025295?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzaHVodWFrYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
我们去掉LBS_OWNERDRAWFIXED这下子又可以了,这倒是奇怪了,完全按照书上写的啊,我们跟踪一下断点。
![](http://img.blog.csdn.net/20150416192359140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzaHVodWFrYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
既然程序执行到了MeasureItem说明前面设置的自绘起了作用,不过CListBox的MeasureItem函数一进入马上触发中断,这也就是说,你一旦设置了LBS_OWNERDRAWFIXED风格,必须重写DrawItem和MeasureItem函数,同理设置了LBS_SORT风格,也必须重写CompareItem函数,他们都是虚函数。
![](http://img.blog.csdn.net/20150416193040501?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzaHVodWFrYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
问题来了,我们不是重写了DrawItem和MeasureItem函数吗?请看清楚了,我们写的函数前面还有一个afx_msg限定,这是一个CWnd类的消息响应函数,是虚函数吗?
![](http://img.blog.csdn.net/20150416193552751?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzaHVodWFrYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
看清楚了,我们应该是重写虚函数,而不是响应消息函数,添加后的消息如下图所示:
![](http://img.blog.csdn.net/20150416193548442?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzaHVodWFrYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
带virtual修饰符的,这样才是正确的,少年,别手一溜,就加错了函数,引起了不必要的错误,现在编译一下,应该就不存在错误了!
自绘控件很简单,按照书上的步骤一步一步来操作即可,就拿自绘CListBox为例。
我们从CListBox派生出一个子类CListBoxEx,然后添加DrawItem和MeasureItem函数即可。我不知道有多少人和我一样,喜欢通过机器自动给我们添加。
机器添加代码之后,我们的类大概就变成了这样子:
好了,我们姑且在这两个函数里面什么也不干吧!现在我们动态创建一个CListBoxEx控件吧!
现在可以启动程序了,是不是一启动就报错呢?
我们去掉LBS_OWNERDRAWFIXED这下子又可以了,这倒是奇怪了,完全按照书上写的啊,我们跟踪一下断点。
既然程序执行到了MeasureItem说明前面设置的自绘起了作用,不过CListBox的MeasureItem函数一进入马上触发中断,这也就是说,你一旦设置了LBS_OWNERDRAWFIXED风格,必须重写DrawItem和MeasureItem函数,同理设置了LBS_SORT风格,也必须重写CompareItem函数,他们都是虚函数。
问题来了,我们不是重写了DrawItem和MeasureItem函数吗?请看清楚了,我们写的函数前面还有一个afx_msg限定,这是一个CWnd类的消息响应函数,是虚函数吗?
看清楚了,我们应该是重写虚函数,而不是响应消息函数,添加后的消息如下图所示:
带virtual修饰符的,这样才是正确的,少年,别手一溜,就加错了函数,引起了不必要的错误,现在编译一下,应该就不存在错误了!
相关文章推荐
- Cocoapods配置第三方类库教程
- Object.toString()
- OpenSceneGraph FAQ 【转】
- 在struts2中用jquery.ajax提交表单实例
- java篇 【0】概述
- hdu4545 魔法串
- Java中的运算符
- 设置dt height 保证dd在同一行
- 【POJ 3007】 Organize Your Train part II (字符串HASH)
- iOS关于通讯录的实现
- PickView简单的依赖
- 自定义控件之_自定义圆形进度条
- JAXB 实现JavaBean与xml互转(二)-封装
- 模态推出 tableView 时不使其全屏
- 黑马程序员----C 语言学习笔记之枚举类型和typedef关键字
- 自定义一个类加载器
- 个人博客作业-Week2 (代码规范, 代码复审)
- ToggleButton学习
- Ural 1114 Boxes
- 软工文档