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
相关文章:
自绘控件的4种方法
http://blog.csdn.net/weiwangchao_/article/details/6832566
转载于:https://www.cnblogs.com/riasky/p/3435845.html
相关资源:MFC自绘列表控件