NMHDR

iden wNotifyCode idCon

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

相關詞條

相關搜尋

熱門詞條

聯絡我們