http://hi.baidu.com/422053362/item/86b5bc088a8801006c9048eb
公用控件分为三类消息,
第一类消息:由应用程序发送给控件的消息,用于改变控件的属性或使用控件的功能
用SendMessage or PostMessage as so on.
例如以下消息都是:
ACM_OPEN
ACM_PLAY
ACM_STOP
SB_GETBORDERS
SB_GETICON
SB_GETPARTS
SB_GETRECT
SB_GETTEXT
SB_GETTEXTLENGTH
SB_GETTIPTEXT
SB_GETUNICODEFORMAT
SB_ISSIMPLE
SB_SETBKCOLOR
SB_SETICON
SB_SETMINHEIGHT
SB_SETPARTS
SB_SETTEXT
SB_SETTIPTEXT
SB_SETUNICODEFORMAT
SB_SIMPLE
TB_ADDBITMAP
TB_ADDBUTTONS
TB_ADDSTRING
TB_AUTOSIZE
TB_BUTTONCOUNT
TB_BUTTONSTRUCTSIZE
TB_CHANGEBITMAP
TB_CHECKBUTTON
第二类消息:在控件上有event发生时,控件给父窗口发送的消息,包括:
WM_NOTIFY:
WM_NOTIFYFORMAT:用来决定窗口 在WM_NOTIFY消息中是接收ANSI还是Unicode 结构体
第三类消息:其实不能算独立的消息,而是通知码,英文叫Notification Messages,或者说是附加消息,一般是附加在第二类消息WM_NOTIFY或者WM_COMMAND消息的lParam上
像以下这些消息:
NM_CHAR
NM_CUSTOMDRAW
NM_CLICK
NM_DBLCLK
NM_HOVER
NM_KEYDOWN
NM_KILLFOCUS
NM_NCHITTEST
NM_OUTOFMEMORY
NM_RCLICK
NM_RDBLCLK
NM_RELEASEDCAPTURE
NM_RETURN
NM_SETCURSOR
NM_SETFOCUS
NM_TOOLTIPSCREATED
ACN_START//附加在WM_COMMAND消息上
ACN_STOP//附加在WM_COMMAND消息上
NM_CLICK (status bar)
NM_DBLCLK (status bar)
NM_RCLICK (status bar)
NM_RDBLCLK (status bar)
SBN_SIMPLEMODECHANGE
TBN_BEGINADJUST
TBN_BEGINDRAG
TBN_CUSTHELP
TBN_DELETINGBUTTON
TBN_DRAGOUT
TBN_DROPDOWN
TBN_ENDADJUST
TBN_ENDDRAG
TBN_GETBUTTONINFO
TBN_GETDISPINFO
TBN_GETINFOTIP
TBN_GETOBJECT
TBN_HOTITEMCHANGE
TBN_QUERYDELETE
TBN_QUERYINSERT
TBN_RESET
TBN_TOOLBARCHANGE
TTN_GETDISPINFO
TTN_POP
TTN_SHOW
下面主要讲述WM_NOTIFY消息
其附加消息中,wParam是idCtrl;lParam是一个指针,指向NMHDR结构体 或者是 指向第一个成员是NMHDR结构体的结构体,上面说的第三类消息就附加在这里面
下面的例子说明了一个问题:不同控件同样是发送WM_NOTIFY消息,但是lParam却可以指向不同的结构体
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=#ff0000;
ptvcd->clrTextBk=#009632;
return CDRF_NEWFONT;
}
}
break;
default:
break;
}
break;