CListCtrl控件功能扩展
2010年05月19日
一、所有者绘制(owner-draw)和自定义绘制(custom-draw)
这两种方法应该是控件自绘中最常用到的普遍方法。(当然如果只是改变控件颜色只需要处理WM_CTLCOLOR消息就可以了。)但是对于这两者的区别,可能很多开发人员并不是很清楚。如果你做过控件自绘,可能对owner-draw已经很熟悉了。一般只要设置控件的自绘风格属性,并实现owner-draw的消息(WM_DRAWITEM)响应虚函数(DrawItem)就可以了。可以应用这种方法的控件包括拥有自绘风格的Button、ComboBox、ListCtrl、Menu、StatusBar、HeaderCtrl、TabCtrl等大部分控件,MFC在控件需要重绘的时候调用绘制函数,并传递DC及控件位置、大小等信息,我们需要做的就是利用这些信息来绘制自己需求的控件外观。但是这种方式不能用于EditCtrl,也不能用于非report风格的ListCtrl。
custom-draw方式是响应的NM_CUSTOMDRAW消息,与WM_DRAWITEM消息不同,它是被包含在WM_NOTIFY消息中被发送的,需要在类实现中加入消息映射。与owner-draw方式比较,这种绘制方式最大的优势是对绘制的阶段进行了严格控制,可以在不同的响应阶段进行不同的绘制策略,比如既可以进行默认绘制,也可以重载函数进行特殊绘制,还可以只改变一些变量的值让MFC自己去按照要求重绘。我们知道owner-draw方式的绘制函数中,对于所有的绘制细节都需要进行GDI或GDI+的代码控制,而custom-draw方式中,我们可能仅仅改变几个变量值(比如控件颜色)就完成了需求。custom-draw方式支持的控件包括ListView、ToolBar、ToolTip、TreeView等,其中对于ListCtrl支持所有的样式。关于custom-draw的详细信息,可以参考这篇文章http://msdn.microsoft.com/zh-cn/library/ms364048(VS.80).aspx。
二、加载缩略图
这个其实很简单,自己创建一个CImageList类型的对象,并自定义图像的大小及像素类型,然后调用CListCtrl的SetImageList函数设置就可以了。需要注意的一点是,normal和small两种type中,small类型必须设置。
三、自定义表头
需要写一个继承CHeaderCtrl的子类,实现DrawItem函数,在其中进行表头背景和字体、文本颜色等设置并进行绘制;如果要改变表头的高度,可以映射HDM_LAYOUT消息响应函数,在其中设置控件布局。之后在自己的ListCtrl类中声明一个自定义的HeaderCtrl类型变量,并在PreSubclassWindow函数中调用HeaderCtrl的SubclassWindow函数使其子类化,然后在初始化的时候使其各Item的format具有HDF_OWNERDRAW风格就可以了。
四、调整CListCtrl的背景、字体、文本颜色和行高
实现思路与上述表头的方法基本相同。当然要设置list的自绘风格,并选择自绘的方式。另外对于调整行高,如果加载了缩略图的话,行高就会随之调整了。另一个简单的办法就是设置字体的大小来实现,与缩略图是一个道理。如果想自己精确定义行高,则比较麻烦一点。首先设置list的自绘风格,然后重载MeasureItem函数,在其中设置结构体中的item高度变量的值,再在消息映射中添加ON_WM_MEASUREITEM_REFLECT(),就可以让list在合适的时候响应来改变行高。需要注意的两点是:
1、MeasureItem与WM_MEASUREITEM消息响应函数OnMeasureItem是不同的;
2、触发MeasureItem函数调用的WM_MEASUREITEM消息是在一定的情况下才被发送,比较简单的方法是send一个WM_WINDOWPOSCHANGED消息来触发。
3、设置LVS_OWNERDRAWFIXED风格需要在Create或者PreSubclassWindow函数中进行,否则MeasureItem不会被调用。
以上为目前为止的总结,后面有了新的内容会补充进来。
发表评论
-
Programming Applications for Microsoft Windows - 第七部分 附录
2012-01-20 02:07 691Programming Applications for Mi ... -
windows线程学习
2012-01-20 02:07 536windows线程学习 2010年09月01日 线程(t ... -
WINCE及MOBILE常用代码(转)
2012-01-20 02:07 525WINCE及MOBILE常用代码(转) 2010年06月05 ... -
一个对Winsock完成端口模型封装的类
2012-01-20 02:07 532一个对Winsock完成端口模型封装的类 2011年01月0 ... -
MFC架构之CWinThread类
2012-01-20 02:07 707MFC架构之CWinThread类 2010 ... -
赞美女人的词语
2012-01-19 09:58 1330赞美女人的词语 2011年1 ... -
赞美女性的词语大全
2012-01-19 09:58 1048赞美女性的词语大全 2010年07月18日 温柔、体贴 ... -
魅力口才之--精彩赞美词语汇编
2012-01-19 09:58 875魅力口才之--精彩赞美 ... -
Win7系统服务优化攻略
2012-01-19 09:57 977Win7系统服务优化攻略 2011年01月29日 Win ... -
Win7特别功能:优化篇
2012-01-19 09:57 745Win7特别功能:优化篇 201 ... -
c#获取路径 c/s
2012-01-17 02:30 764c#获取路径 c/s 2011年09月09日 一、获取当 ... -
解决无IISXP系统无IIS如何安装IIS【出现问题请看最后面】
2012-01-17 02:30 579解决无IISXP系统无IIS如何安装IIS【出现问题请看最后面 ... -
总体上说,是c++ builder胜于VC++,DELPHI是最好
2012-01-17 02:30 759总体上说,是c++ builder胜 ... -
定制微软的打印机驱动程序(二)
2012-01-17 02:30 1120定制微软的打印机驱动程序(二) 2010年11月10日 ... -
倦了````
2012-01-15 22:14 561倦了```` 2009年06月14日 ... -
.net winform 控件缩写
2012-01-15 22:13 792.net winform 控件缩写 2009年10月08日 ... -
UI-UE测试要点详解(转)
2012-01-15 22:13 1346UI-UE测试要点详解(转) 2 ...
相关推荐
非常好用的扩展风格的Clistctrl控件,VC6.0和VS2005实例,附可重用类库
VC 扩展型CListCtrl列表控件,支持双击鼠标实现编辑主项(Item),也可以编辑子项(SubItem),并尽量符合CListCtrl的操作习惯,目前好像很多控件都有这功能的,应该加入这个实用的功能。
CListCtrl重绘,功能很多,编辑、颜色...... 具体见博客:http://blog.csdn.net/dongdan_002/article/details/41895885
对CListCtrl列表控件进行了一个功能扩展,使它支持双击鼠标实现编辑主项(Item),也可以编辑子项(SubItem),并尽量符合CListCtrl的操作习惯。这个对VC的爱好者们应该很有用,必竟双击编辑已经让我们大部分人感觉很...
对CListCtrl控件进行了一个扩展,使它即可以编辑主项(Item),又可以编辑子项(SubItem),并尽量符合CListCtrl的操作习惯。
在MFC的CListCtrl控件的单元格内增加编辑框,下拉框等
对MFC的CListCtrl控件的扩展,可以对每行添加进度条、编辑框、复选框等控件
扩展CListCtrl类支持列的排序,可指定行的背景色,前景色。简单易用。使用的时候,只需要把CListCtrl简单替换即可。如原来的定义是:CListCtrl lstData;现在只需要改成CZyList/*CListCtrl*/ lstData;即可
该扩展的CListCtrl 支持单元格增加如下控件 编辑框 单选框 复选框 按钮 进度条 下拉列表框
MFC ListControl 控件 拖拽文件扩展, 主要演示了如何扩展MFC已有控件,以及简单实现了List Control 的文件拖拽功能
对CListCtrl控件的重绘,包括编辑SubItem、更改行背景颜色字体等功能超多... 具体功能请参见以下博客内容:http://blog.csdn.net/dongdan_002/article/details/41895885 互相学习,好资源大家都要共享哦!
本代码对CListCtrl控件进行了一个扩展,使它即可以编辑主项(Item),又可以编辑子项(SubItem),并尽量符合CListCtrl的操作习惯。
一个自绘的CListCtrlEx列表控件类,可以支持: (1)设置奇数行背景颜色(默认白色) (2)设置偶数行背景颜色(默认白色) (3)设置热点行背景颜色(默认白色) (4)设置选中行背景颜色(默认蓝色) (5)设置...
本资源中提供了CListCtrlEx的CPP与H文件与一个Demo示例,CListCtrlEx继承自CListCtrl,可以让您很方便的操作listCtrl控件。此类最初来源于网络,本人在其上进行加工整理,添加了一些新功能,优化了一些细节代码,...
vc6编程单文档类扩展 动态创建控件 表格可编辑 事件处理
实现了,微软自带的列表控件没实现的相关功能,比如实现 控件的编辑。。。自己看吧,很简单的,直接将里面的report.h/.cpp文件引入到自己工程工程就ok,相当于自己写的类(继承于CListCtrl)
基于VC++编写的几个MFC基础控件重绘的代码,包含CButton、CCombox、CListCtrl、CEdit、CStatic等基础控件,可扩展性强,适合初学者进行学习和参考