複製鏈接
請複製以下鏈接發送給好友

NMHDR

鎖定
NMHDR,是一種程序。
中文名
NMHDR
NMHDR
Notify Message Handler
成    員
typedef struct tagNMHDR
識符代碼
TBN_BEGINADJUST

NMHDR程序定義

NMHDR = Notify Message Handler
NMHDR 結構包含下列成員:
typedefstructtagNMHDR{
HWNDhwndFrom;//handle of control sending message
UINTidFrom;//identifier of control sendingmessage
UINTcode;//notification code;see below
}NMHDR;
消息通過下面的宏定義之:
ON_NOTIFY( wNotifyCode, idControl, memberFxn )
wNotifyCode
通知消息標識符代碼,如 TBN_BEGINADJUST。
idControl
發送通知的控件的標識符。
memberFxn
接收到通知時調用的成員函數。
成員函數將用下列原型聲明:
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );
在WM_NOTIFY中,lParam中放的是一個稱為NMHDR結構的指針。在wParam中放的則是控件的ID。

NMHDR結構來歷

NMHDR結構是很值得一提的,該結構包括有關製作該通知的控件的任何內容,而不受空間和類型的限制,他的來歷也是很有意思的。
在最初的windows3.x中,根本就不存在什麼WM_NOTIFY,控件通知它們父窗口,如鼠標點擊,控件背景繪製事件,通過發送一個消息到父窗口。簡單的通知僅發送一個WM_COMMAND消息,包含一個通知碼和一個在wParam中的控件ID及一個在lPraram中的控件句柄。這樣一來,wParam和lParam就都被充了,沒有額外的空間來傳遞一些其它的消息,例如鼠標按下的位置和時間。
為了克服這個困難,windows3.x就提出了一個比較低級的解決策略,那就是給一些消息添加一些附加消息,最為明顯的就是控件自畫用到的DRAWITEMSTRUCT。不知道大家對這個結構熟悉不,不過,如果你是老手,你應該非常清楚這個結構,這個結構包含了9個內容,幾乎你需要控制的信息都給你提供了。為什麼説它比較低級呢?因為不同的消息附加的內容不同,結果就是一盤散沙,非常混亂。
在win32中,MS又提出了一個更好的解決方案:引進NMHDR結構。這個結構的引進就是消息統一起來,利用它可以傳遞複雜的信息。這個結構的佈局如下:
NMHDR
{
HWndhWndFrom;相當於原WM_COMMAND傳遞方式的lParam
UINTidFrom;相當於原WM_COMMAND傳遞方式的wParam(low-order)
UINTcode;相當於原WM_COMMAND傳遞方式的NotifyCode(wParam"shigh-order)
};
對於這個結構的應用於WM_NOTIFY信息結構,結果WM_NOTIFY就變成了:
A、無附加信息。結構變得很簡單,就是一個NMHDR結構。
B、有附加信息。定義一個大的結構,它的第一個元素就是NMHDR結構,它的後面放置附加信息。
舉例://得到選中的列
voidCMyView::OnColumnclick(NMHDR*pNMHDR,LRESULT*pResult)
{
NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;
//得到選中的列
column=pNMListView->iSubItem;
}