- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
不同控件发送WM_NOTIFY消息(lParam里面包含NM_CUSTOMDRAW通知码)时,lParam指向的结构体可
能是不同的,既可以是NMCUSTOMDRAW,也可以比结构体NMCUSTOMDRAW大,但第一个成员必
须是NMCUSTOMDRAW,如TreeView控件发送NM_CUSTOMDRAW通知码时,lParam指向的是NMTVCUSTOMDRAW结构体,这个结构体的第一个成员是NMCUSTOMDRAW结构体
typedef struct tagNMCUSTOMDRAWINFO {
NMHDR hdr;
DWORD dwDrawStage;//表示当前绘制阶段
HDC hdc;
RECT rc;
DWORD dwItemSpec;
UINT uItemState;
LPARAM lItemlParam;
} NMCUSTOMDRAW;
typedef struct tagNMTVCUSTOMDRAW
{
NMCUSTOMDRAW nmcd;
COLORREF clrText;
COLORREF clrTextBk;
#if (_WIN32_IE >= 0x0400)
int iLevel;
#endif
} NMTVCUSTOMDRAW;
dwDrawStage成员可以有以下值:
CDDS_POSTERASE:清除循环完成后
CDDS_POSTPAINT:绘制循环完成后
CDDS_PREERASE:清楚循环开始时
CDDS_PREPAINT:绘制循环开始时
CDDS_ITEM:指明dwItemSpec, uItemState, and lItemlParam成员有效。
CDDS_ITEMPOSTERASE:清除an item后
CDDS_ITEMPOSTPAINT:绘制an item后
CDDS_ITEMPREERASE:清除an item前
CDDS_ITEMPREPAINT:绘制an item前
CDDS_SUBITEM:Version 4.71. Flag combined with CDDS_ITEMPREPAINT or CDDS_ITEMPOSTPAINT if a subitem is being drawn. This will only be set if
如果dwDrawStage成员==CDDS_PREPAINT,有以下返回值:
CDRF_DODEFAULT:自己画,不发送NM_CUSTOMDRAW
CDRF_NOTIFYITEMDRAW:绘制items前、后都发送NM_CUSTOMDRAW
CDRF_NOTIFYPOSTERASE:清除an item后发送NM_CUSTOMDRAW
CDRF_NOTIFYPOSTPAINT:绘制an item后发送NM_CUSTOMDRAW
CDRF_NOTIFYSUBITEMDRAW:Version 4.71. The control will notify the parent when a list view subitem is being drawn
如果dwDrawStage成员==CDDS_ITEMPREPAINT,有以下返回值:
CDRF_NEWFONT:为item指定新的字体
CDRF_SKIPDEFAULT:应用程序手工绘制the item,The control不绘制the item.
下面是例子:
case WM_NOTIFY:
phdr=(NMHDR*)lParam;//不管lParam是指向什么结构体,起始部分都是NMHDR
switch(phdr->code)//根据通知码的不同,从而知道指向什么结构体
{
case TVN_BEGINDRAG://说明lParam指向的是一个NM_TREEVIEW结构体
ptree=(NM_TREEVIEW*)lParam;
break;
case NM_CUSTOMDRAW://可以发送NM_CUSTOMDRAW通知码的控件很多
pcd=(NMCUSTOMDRAW*)lParam;
if(wParam==ID_HWNDTREE)//如果是TREEVIEW控件发送的
{
ptvcd=(NMTVCUSTOMDRAW*)lParam;
if(ptvcd->nmcd.dwDrawStage==CDDS_PREPAINT)//Before the painting cycle begins
{
//the control will send NM_CUSTOMDRAW notification messages to the parent,before and after drawing items
return CDRF_NOTIFYITEMDRAW;
}
if(ptvcd->nmcd.dwDrawStage==CDDS_ITEMPREPAINT)//Before an item is drawn
{
newfont=(HFONT)GetStockObject(ANSI_FIXED_FONT);
SelectObject(ptvcd->nmcd.hdc,newfont);
ptvcd->clrText=RGB(255,0,0);
ptvcd->clrTextBk=RGB(0,150,50);
return CDRF_NEWFONT;
}
}
break;
default:
break;
}
break; |
|