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

NMLVCUSTOMDRAW

ToolTips

NMTTCUSTOMDRAW

Tree view

NMTVCUSTOMDRAW

其他支持控件

NMCUSTOMDRAW

为什么不一样那,下面让我们查一下他们的结构:

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

相关文章:

种方法

http://blog.csdn.net/weiwangchao_/article/details/6832566

MFC常用控件CListCtrl 、CSliderCtrl、CToolTipCtrl、CTreeCtrl的自绘的更多相关文章

  1. VS2008/MFC —常用控件使用总结 转载

    在公司培训期间,经理给了我们没人10个界面草图,让我们在VS2008下使用MFC设计,因为在经理的帮助和自己的努力下,终于在三天时间内完成,现在就根据在这三天 时间里所用到的控件做出如下总结: 1.D ...

  2. VS2010/MFC常用控件:图片控件Picture Control

    图片控件Picture Control 本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到 ...

  3. MFC常用控件之列表视图控件(List Control)

    近期学习了鸡啄米大神的博客,对其中的一些知识点做了一些自己的总结.不过,博客内容大部分来自鸡啄米.因此,这个博客算是转载博客,只是加了一些我自己的理解而已.若想学习鸡啄米大神的博客总结,请点击连接:h ...

  4. MFC常用控件之滚动条

    近期学习了鸡啄米大神的博客,对其中的一些知识点做了一些自己的总结.不过,博客内容大部分来自鸡啄米.因此,这个博客算是转载博客,只是加了一些我自己的理解而已.若想学习鸡啄米大神的博客总结,请点击连接:h ...

  5. VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)

    前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建.CTreeCtrl类的主要成员函数和应用实例. 树形控件的创建 MFC为树形控件提 ...

  6. Visual studio C++ MFC之列表控件CListCtrl Control

    背景 本篇旨在MSDN帮助文档下总结列表控件CListCtrl Control的使用,并列出碰到的具体问题. 正文 列表型控件List Control的类是ClistCtrl,具体成员对象详见链接,以 ...

  7. MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)

    本节继续讲解常用控件--按钮控件的使用. 按钮控件简介 按钮控件包括命令按钮(Button).单选按钮(Radio Button)和复选框(Check Box)等.命令按钮就是我们前面多次提到的侠义的 ...

  8. MFC编程入门之二十(常用控件:静态文本框)

    上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控 ...

  9. MFC之常用控件(四)

    常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控件.列表控件.树形控件和进度条控件等等.本节教程先来讲解静态文本框的使用. 控件的通知消息 在将静态文本框的使用之 ...

随机推荐

  1. ioctl函数详细说明

    本函数影响由fd 参数引用的一个打开的文件. #include<unistd.h> int ioctl( int fd, int request, .../* void *arg */ ) ...

  2. 转: requirejs压缩打包r.js使用示例 2 (~~很详细的教程)

    这一篇来认识下打包工具的paths参数,在入门一中 就介绍了require.config方法的paths参数.用来配置jquery模块的文件名(jQuery作为AMD模块时id为“jquery”, 但 ...

  3. Linux上MongoDB的安装与配置

    长话短说,一共有两种方法.(我随便选了一个发行版Mint) 一.apt-get方法 官网上说的很清楚: http://docs.mongodb.org/manual/tutorial/install- ...

  4. apache .htaccess文件详解和配置技巧总结

    一..htaccess的基本作用 .htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令.       .htaccess主要的作用有:URL重写.自定义错误页面.MIME类 ...

  5. uva 10891 Game of Sum(区间dp)

    题目连接:10891 - Game of Sum 题目大意:有n个数字排成一条直线,然后有两个小伙伴来玩游戏, 每个小伙伴每次可以从两端(左或右)中的任意一端取走一个或若干个数(获得价值为取走数之和) ...

  6. ulipad双击无反应

    所有的东西都配好后,执行ulipad需要注意的是: 1,必须以管理员身份运行ulipad. 2,当运行有道词典的时候,双击ulipad是没有反应, 至于为什么会出现这种情况,我也不太清除,等我查到 原 ...

  7. filter过滤器的使用

    从J2EE1.3开始,Servlet2.3规范中加入了对过滤器的支持.过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种,下面让我们分别来看看这四种过滤器的工作方式: 1.reques ...

  8. 实战nginx 基础知识总结(一)1.1

    squid Squid是一个缓存Internet数据的软件,其接收用户的下载申请,并自动处理所下载的数据.当一个用户想要下载一个主页时,可以向Squid发出一个申请,要Squid代替其进行下载,然后S ...

  9. Android 开发 AirPlay Server

    安卓上开发  AirPlay Server  主要是参考了和修改了 DroidAirPlay项目 , 和Airplay 协议 1, 将DroidAirPlay 下载下来 2, Eclipse 新建一个 ...

  10. docker 学习笔记20:docker守护进程的配置与启动

    安装好docker后,需要启动docker守护进程.有多种启动方式. 一.服务的方式 因为docker守护进程被安装成服务.所以,可以通过服务的方式启停docker守护进程,包括查看状态. sudo ...