1、訊息反射解釋:
父視窗將子視窗發給它的通知訊息,首先反射回子視窗進行處理(即給子視窗乙個機會,讓子視窗處理此訊息),這樣通知訊息就有機會能被子視窗自身進行處理。
2、mfc中引入訊息反射的原因:
在windows的訊息處理中,子視窗的發給其父視窗的通知訊息只能由其父視窗進行處理,這使得子視窗的自身能動性大大降低(你想,它連改變自己的背景色,處理乙個自身滾動問題都要其父視窗來完成),為了解決這個問題,在
mfc中引入了
反射訊息
「reflect message
」的概念,進行訊息反射,可以使得控制子視窗能夠自行處理與自身相關的一些訊息,增強了封裝性,從而提高了控制子視窗的可重用性。
訊息反射的處理流程(不考慮ole控制)
一、訊息反射處理流程圖:
1、父視窗收到控制子視窗發來的通知訊息後,呼叫它的虛函式cwnd::onnotify.
cwnd::onnotify()主體部分:
分析:首先,呼叫reflectlastmsg(hctrlchildwnd,...)給子視窗乙個自身處理的機會,將訊息反射給子視窗處理,函式返回
true,
表明子視窗處理了此訊息。反之,表示子視窗未處理此訊息,此時,呼叫
oncmdmsg(...)
由父視窗進行通常的處理。
2、reflectlastmsg中:
主要是呼叫傳送視窗的sendchildnotifylastmsg(...)。
3、sendchildnotifylastmsg 中:
呼叫傳送視窗的虛函式onchildnotify函式,進行處理。 如果沒有處理,則呼叫reflectchildnotify(...)函式進行標準的反射訊息 的訊息對映處理。
二、訊息處理
方式1:
由上述處理流程可以看出來,子視窗要想自身處理此訊息,過載子控制項視窗的onchildnotify虛函式應該是很容易想到的方式。
注意:mfc中對各個子控制項視窗一般都已經過載了onchildnotify函式,它對應呼叫類的虛函式進行處理,所以,你過載對應的虛函式即可,如下例:
bool cstatusbarctrl::onchildnotify(uint message, wparam wparam, lparam lparam,lresult* presult)
virtual
void drawitem( lpdrawitemstruct lpdrawitemstruct );
void cstatusbarctrl::drawitem(lpdrawitemstruct)
你過載cstatusbarctrl類的drawitem虛函式,即可實現對反射訊息 wm_drawitem的處理。
方式2:
從方式1可以看出,如果你不在被過載的onchildnotify中對訊息進行處理,函式會呼叫cwnd::onchildnotify,它呼叫reflectchildnotify函式進行標準的處理。
1、增加反射訊息 的對映入口。
2、增加對應的訊息處理函式。
注意:可以使用
mfc的
classwizard
作上述動作,在
classwizard
中,可處理的反射訊息
以乙個"="
號以示區別。返回值為
true,
表示控制項視窗已處理此反射訊息
,為false,
表示控制項子視窗未處理此反射訊息。
結語:
訊息反射不是很難的概念。它僅出現在mfc中;它的用意是方便控制子視窗的重用;對某些通知訊息你可以過載對應的虛函式(wm_drawitem...)進行處理;對其它你可以使用標準的訊息反射對映進行處理。
MFC的訊息反射機制
1 訊息反射解釋 父視窗將子視窗發給它的通知訊息,首先反射回子視窗進行處理 即給子視窗乙個機會,讓子視窗處理此訊息 這樣通知訊息就有機會能被子視窗自身進行處理。2 mfc中引入訊息反射的原因 在windows的訊息處理中,子視窗的發給其父視窗的通知訊息只能由其父視窗進行處理,這使得子視窗的自身能動性...
mfc訊息反射機制簡介
在windows裡面,子控制項經常向父控制項傳送訊息,例如很多子控制項要繪製自己的背景,就可能向父視窗傳送訊息wm ctlcolor。對於從子控制項發來的訊息,父控制項有可能在處理之前,把訊息返還給子控制項處理,這樣訊息看起來就想是從父視窗反射回來一樣,故此得名 訊息反射。訊息反射機制剝離了子父控制...
深度剖析MFC訊息反射機制
附 我稍加修改 摘要 在前面我們分析了控制項通知訊息wm notify,和wm notify緊密聯絡的還有乙個mfc新特性 訊息反射。本文中,我想就這個問題作乙個全面的論述,如果有錯誤,還望各路大蝦批評指正。什麼是訊息反射?在windows裡面,子控制項經常向父控制項傳送訊息,例如很多子控制項要繪製...