MFC的訊息反射機制

2021-06-26 08:27:14 字數 1833 閱讀 1166

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裡面,子控制項經常向父控制項傳送訊息,例如很多子控制項要繪製...