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;