WM NOTIFY訊息流程例項分析

2021-09-06 07:05:21 字數 2606 閱讀 3967

我們以clistctrl控制項為例來分析wm_notify訊息。    clistctrl控制項在report樣式下會包含cheaderctrl標頭控制項,即cheaderctrl標頭控制項為clistctrl控制項的子控制項,所以不難理解,拖動cheaderctrl標頭控制項的列分隔欄會投遞hdn_begintrack訊息(wm_notify訊息,通知碼為hdn_begintrack)給其父視窗clistctrl控制項。

但是,我們在對話方塊視窗中也可以收到cheaderctrl標頭控制項的hdn_begintrack訊息,這作何解釋呢?

如下所示:我們在對話方塊視窗中響應hdn_begintrack訊息,當開始拖動標頭控制項時,彈出訊息框提示。

[cpp]view plain

copy

print?

begin_message_map(ctestdlgdlg, cdialog)  

......  

on_notify(hdn_begintrack, 0, &ctestdlgdlg::onhdnbegintracklist1)  

......  

end_message_map()  

void ctestdlgdlg::onhdnbegintracklist1(nmhdr *pnmhdr, lresult *presult)  

begin_message_map(ctestdlgdlg, cdialog)

......

on_notify(hdn_begintrack, 0, &ctestdlgdlg::onhdnbegintracklist1)

......

end_message_map()

void ctestdlgdlg::onhdnbegintracklist1(nmhdr *pnmhdr, lresult *presult)

效果如下:

在文章mfc訊息處理流程概述中可知,clistctrl控制項視窗在接收到hdn_begintrack訊息時,會呼叫以下**處理:

[cpp]view plain

copy

print?

lresult cwnd::windowproc(uint message, wparam wparam, lparam lparam)    

lresult cwnd::windowproc(uint message, wparam wparam, lparam lparam)  

很顯然,hdn_begintrack訊息在clistctrl的訊息對映表中沒有對應的訊息處理函式處理,在cheaderctrl的訊息對映表也無對應的反射訊息處理函式處理,所以,以上**onwndmsg(message, wparam, lparam, &lresult)會返回false,所以會交由預設的訊息處理函式defwindowproc(message, wparam, lparam)處理,該函式會將該訊息投遞給訊息對應視窗(message.hwnd)的父視窗處理,即對話方塊視窗(當然,對應的message.hwnd變為了對話方塊視窗),這樣對話方塊視窗才有機會處理該訊息而彈出訊息框。

如果在clistctrl中處理了hdn_begintrack訊息,則就不會交由對話方塊視窗處理。

為此,我們增加cmylistctrl,繼承自clistctrl,在cmylistctrl中處理hdn_begintrack訊息。

[cpp]view plain

copy

print?

begin_message_map(cmylistctrl, clistctrl)  

on_notify(hdn_begintracka, 0, &cmylistctrl::onhdnbegintrack)  

on_notify(hdn_begintrackw, 0, &cmylistctrl::onhdnbegintrack)  

end_message_map()  

void cmylistctrl::onhdnbegintrack(nmhdr *pnmhdr, lresult *presult)  

begin_message_map(cmylistctrl, clistctrl)

on_notify(hdn_begintracka, 0, &cmylistctrl::onhdnbegintrack)

on_notify(hdn_begintrackw, 0, &cmylistctrl::onhdnbegintrack)

end_message_map()

void cmylistctrl::onhdnbegintrack(nmhdr *pnmhdr, lresult *presult)

同時將對話方塊中的clistctrl m_list改為cmylistctrl m_list。則效果如下:

例項**:

from:

WM NOTIFY訊息流程例項分析

我們以clistctrl控制項為例來分析wm notify訊息。clistctrl控制項在report樣式下會包含cheaderctrl標頭控制項,即cheaderctrl標頭控制項為clistctrl控制項的子控制項,所以不難理解,拖動cheaderctrl標頭控制項的列分隔欄會投遞hdn beg...

WM Notify與訊息反射

關於wm notify與訊息反射 耗費我兩天時間才解決的問題 綜合資源電子書社群 其實,問題很簡單,我想在listctrl響應nm setfocus的同時通知其父視窗 其實我這句話說錯了,listctrl只能響應 nm setfocus,為什麼有個 呢?稍後解釋 最幼稚的想法是讓在listctrl和...

控制項的WM NOTIFY訊息對映

控制項的wm notify訊息對映 前幾天,我嘗試在clistctrl中對映hdn begintrack這個wm notify訊息。輕鬆的用classwizard建立了訊息對映,幾秒中完成了所有工作之後發生的事情卻讓我很長時間輕鬆不起來了。訊息根本對映不上!begin message map cpr...