MFC常用控件CListCtrl 、CSliderCtrl、CToolTipCtrl、CTreeCtrl的自绘
Window平台下MFC提供的CListCtrl 、CSliderCtrl、CToolTipCtrl、CTreeCtrl等控件大多时候是不能满足我们的需求,如果我要在改变滑动条的颜色,我要改变滑动条的背景色;我在CListCtrl中添加图片,添加一个复选框,等等等等。可是使用OnPaint自己完全重回,实现将较为费力。
common control 4.7版本介绍了一个新的特性叫做Custom Draw,这个名字显得模糊不清,让人有点摸不着头脑,而且MSDN里也只给出了一些如风的解释和例子,没有谁告诉你你想知道的,和究竟这个特性有什么好处。
Custom draw可以被想象成一个轻量级的,容易使用的重绘方法(重绘方法还有几种,例如Owner Draw等)。这种容易来自于我们只需要处理一个消息(NM_CUSTOMDRAW),就可以让Windows为你干活了,你就不用被逼去处理"重绘过程"中所有的脏活了。
在MFC框架中添加自绘函数(注意不要添加WM_PAINT消息,不然NM_CUSTOMDRAW消息有时是无效的)。我们可以通过类向导添加=NM_CUSTOMDRAW消息。也可以手动添加如下代码:
在.h头文件中:
Afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
在.cpp中添加
BEGIN_MESSAGE_MAP(MyListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw);
END_MESSAGE_MAP
void MyListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW *pLVCD = reinterpret_cast<NMLVCUSTOMDRAW>(pNMHDR);
*pResult = 0;
}
而对于CSliderCtrl中定义的函数中应该这么转换类型
LPNMCUSTOMDRAW lpNCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
|
控件 |
对应结构 |
|
List view |
|
|
ToolTips |
|
|
Tree view |
|
|
其他支持控件 |
为什么不一样那,下面让我们查一下他们的结构:
1、NMLVCUSTOMDRAW结构包含信息用于list-view control的NM_CUSTOMDRAW消息(MSDN)
typedefstructtagNMLVCUSTOMDRAW {
NMCUSTOMDRAW nmcd; // 常规的绘制信息
COLORREFclrText; // 文本色
COLORREFclrTextBk; // 文本背景色
#if (_WIN32_IE >= 0x0400)
int iSubItem;
#endif
#if (_WIN32_IE >= 0x0560)
DWORD dwItemType;
COLORREF clrFace;
int iIconEffect;
int iIconPhase;
int iPartId;
int iStateId;
RECT rcText;
UINT uAlign;
#endif
} NMLVCUSTOMDRAW, *LPNMLVCUSTOMDRAW;
2、结构包含信息用于ToolTip control发送的NM_CUSTOMDRAW消息(MSDN)
typedef struct tagNMTTCUSTOMDRAW {
NMCUSTOMDRAW nmcd;
UINT uDrawFlags;
} NMTTCUSTOMDRAW, FAR* LPNMTTCUSTOMDRAW;
uDrawFlags
使用一个整型表示toolTip文本的格式。应用程序可以改变这个成员变量的值,以改动ToopTip绘制的文本。这个值传送给DrawText函数。具体请查阅:
http://msdn.microsoft.com/en-us/library/ms930637.aspx
3、结构包含信息用于tree view control发送的NM_CUSTOMDRAW消息(MSDN)
typedef struct tagNMTVCUSTOMDRAW {
NMCUSTOMDRAW nmcd; // 绘制信息
COLORREF clrText; // 文本颜色
COLORREF clrTextBk; // 文本背景色
} NMTVCUSTOMDRAW, *LPNMTVCUSTOMDRAW;
4、其他支持控件使用结构(以上结构也包含该结构)
typedefstructtagNMCUSTOMDRAWINFO {
NMHDR hdr; // 指向包含这个消息信息的NMHDR结构的句柄
DWORD dwDrawStage; // 表示当前的绘制阶段
HDC hdc; // 绘图设备上下文句柄,用于完成GDI函数
RECT rc; // 当前项的绘图范围
DWORD_PTR dwItemSpec; // 指明绘制控件的那个部分
UINT uItemState; // 当前项目条的状态
LPARAM lItemlParam; // 应用程序规定的数据
} NMCUSTOMDRAW, *LPNMCUSTOMDRAW;
下表为dwDrawStage参数,显示的全局绘制阶段的值:
|
值 |
描述 |
|
CDDS_POSTERASE |
擦除之后完成的 |
|
CDDS_POSTPAINT |
绘制之后完成的 |
|
CDDS_PREERASE |
擦除之前 |
|
CDDS_PREPAINT |
绘制之前 |
|
CDDS_ITEM |
表明dwItemSpec, uItemState,和lItemParam成员是有效的 |
|
CDDS_ITEMPOSTERASE |
在某项被擦除之后 |
|
CDDS_ITEMPOSTPAINT |
某项被绘制后 |
|
CDDS_ITEMPREERASE |
某项被擦除之前 |
|
CDDS_ITEMPREPAINT |
某项绘制之前 |
dwItemSpec
区分控件部分的编号。这个值是控件约定的值。此外,trackbar控件使用下面的值去表示控件的一部分。
|
值 |
描述 |
|
TBCD_CHANNEL |
即将绘制滑动控件的轨道 |
|
TBCD_THUMB |
表示将要绘制的滑动控件的项目是滑标 |
|
TBCD_TICS |
表示将要绘制的滑动控件的项目是刻度 |
uItemState
当前项的状态,它可以是下面值的结合。
|
值 |
描述 |
|
CDIS_CHECKED |
该项被复选 |
|
CDIS_DEFAULT |
该项处于它的默认状态 |
|
CDIS_DISABLED |
该项不可用 |
|
CDIS_FOCUS |
该项处于激活状态 |
|
CDIS_GRAYED |
该项为灰 |
|
CDIS_HOT |
该项目前处于热区 |
|
CDIS_SELECTED |
该项被选中 |
lItemlParam
应用程序定义的数据。
实例:
CListCtrl
1、改变CListCtrl某行的颜色
http://hi.baidu.com/zll2117/item/f25961b2c3d4f770254b09db
http://www.cnblogs.com/rainbowzc/archive/2012/02/26/2369082.html
2、CListCtrl Demo大全
http://www.verydemo.com/demo_c378_i31212.html
3、CListCtrl的自绘
http://hi.baidu.com/xingxing/item/dc04649580f278bfcd80e59d
CTreeCtrl
http://blog.csdn.net/wojiushi3344/article/details/7463942
CToolTipCtrl
http://www.codeproject.com/Articles/36/Tooltips-in-modal-dialog-boxes
CSliderCtrl
http://tech.sina.com.cn/s/2006-01-24/0953828115.shtml
http://www.codeproject.com/KB/miscctrl/CustomDrawCSliderCtrl.aspx
相关文章:
MFC常用控件CListCtrl 、CSliderCtrl、CToolTipCtrl、CTreeCtrl的自绘的更多相关文章
- VS2008/MFC —常用控件使用总结 转载
在公司培训期间,经理给了我们没人10个界面草图,让我们在VS2008下使用MFC设计,因为在经理的帮助和自己的努力下,终于在三天时间内完成,现在就根据在这三天 时间里所用到的控件做出如下总结: 1.D ...
- VS2010/MFC常用控件:图片控件Picture Control
图片控件Picture Control 本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到 ...
- MFC常用控件之列表视图控件(List Control)
近期学习了鸡啄米大神的博客,对其中的一些知识点做了一些自己的总结.不过,博客内容大部分来自鸡啄米.因此,这个博客算是转载博客,只是加了一些我自己的理解而已.若想学习鸡啄米大神的博客总结,请点击连接:h ...
- MFC常用控件之滚动条
近期学习了鸡啄米大神的博客,对其中的一些知识点做了一些自己的总结.不过,博客内容大部分来自鸡啄米.因此,这个博客算是转载博客,只是加了一些我自己的理解而已.若想学习鸡啄米大神的博客总结,请点击连接:h ...
- VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)
前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建.CTreeCtrl类的主要成员函数和应用实例. 树形控件的创建 MFC为树形控件提 ...
- Visual studio C++ MFC之列表控件CListCtrl Control
背景 本篇旨在MSDN帮助文档下总结列表控件CListCtrl Control的使用,并列出碰到的具体问题. 正文 列表型控件List Control的类是ClistCtrl,具体成员对象详见链接,以 ...
- MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)
本节继续讲解常用控件--按钮控件的使用. 按钮控件简介 按钮控件包括命令按钮(Button).单选按钮(Radio Button)和复选框(Check Box)等.命令按钮就是我们前面多次提到的侠义的 ...
- MFC编程入门之二十(常用控件:静态文本框)
上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控 ...
- MFC之常用控件(四)
常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控件.列表控件.树形控件和进度条控件等等.本节教程先来讲解静态文本框的使用. 控件的通知消息 在将静态文本框的使用之 ...
随机推荐
- Dapper 基础用法
Dapper是.Net下的一个简单orm框架,具有以下特点: 1.简单,只需要一个文件即可(SqlMapper.cs) 2.快速,下面是一个查询结果集在500以上的运行速度对比 3.不要求特定的db ...
- 转: 模块化开发框架seajs简介
JavaScript模块化开发库之SeaJSSeaJS由国内的牛人lifesinger开发.目前版本是1.1.1,源码不到1500行,压缩后才4k,质量极高.这篇会讲述SeaJS的一些基本用法,不会面 ...
- php 用户访问菜单页面,必须登录,判断用户是否登录
<pre name="code" class="python"># 本节课大纲: 一.空模块和空操作 1.空操作 function _empty($ ...
- [python]通过urllib2设置代理访问网址
#!/usr/bin/env pythonimport urllib2 # change followings before useuser = 'foo'passwd = 'bar'proxyser ...
- volley源代码解析(七)--终于目的之Response<T>
在上篇文章中,我们终于通过网络,获取到了HttpResponse对象 HttpResponse是android包里面的一个类.然后为了更高的扩展性,我们在BasicNetwork类里面看到.Volle ...
- PPTPD服务端搭建
http://www.360doc.com/content/14/0304/09/15165033_357558764.shtml . apt-get update; apt-get install ...
- linux 修改IP, DNS 命令
linux 修改IP, DNS 命令 http://www.cnblogs.com/fighter/archive/2010/03/04/1678007.html 修改DNS [root@localh ...
- PyQt中如何结合Qt设计师进行开发
t设计师是Qt的所见即所得的界面设计工具,通过拖拉方式设计界面,但它并不能产生任何代码. Qt设计师使用.ui后缀的XML文件来存储界面内容.通过pyuic4命令可以编译成.py文件,.py文件的内容 ...
- java 对象赋值问题
import java.io.*; class CCircle{ private static double pi = 3.1415; private double radius; public CC ...
- C语言循环剖析(转载)
一.if.else float变量与“零值”进行比较: float fTestVal = 0.0; if((fTestVal >= -EPSINON) && (fTestVal ...