簡體   English   中英

了解CStatic和CWnd以及消息路由

[英]Understanding CStatic and CWnd and message routing

我試圖了解消息路由在MFC中的工作方式,對此我有一些疑問。 想象一個擴展CWnd的控件。 我的第一個問題是:該控件中的所有消息都傳遞給父控件嗎?

我知道CStatic不會發生這種情況,CStatic只會在您設置SS_NOTIFY樣式時傳遞特定的消息。 我想了解的是CStatic特有的還是所有控件都發生了什么。 具體來說,我正在嘗試制作一個具有多個子控件的控件,其唯一目的是定義其布局。 我希望子控件的所有消息都由此中間控件的父控件處理。 例如,如果此布局控件具有子按鈕,則單擊該按鈕時,該消息將發送給要處理的父項。

但是,我不打算手動處理所有消息。 因此,如果我從CWnd而不是CStatic擴展控件,消息將繼續傳遞嗎? 在MFC中可以使用FORWARD_NOTIFICATIONS()嗎? 如果沒有,我寧願擴展我的中間類來根據需要處理消息。 您還知道其他解決方案嗎?

消息發送到窗口本身。

一些窗口通常以WM_NOTIFY消息的形式發送消息給父母,或者以“特殊”消息的形式(例如BN_CLICKED)發送消息給父母。

MFC有一個系統(“反射”系統),使窗口將這些消息發送回窗口本身,以便您可以在控件中處理消息,而不必涉及父控件。

這大致就是抽象的工作方式。 通常,您想要的(擁有一個父控件處理所有發送到所有子控件的所有消息)不是您應該如何做。 例如,您不希望將所有用於子窗口的WM_PAINT發送給父母。

您想要做的(處理按鈕單擊)是不同的。 按鈕單擊以BN_CLICKED的形式“發出”。 無論如何,這些都將由父母處理。

如果仍然確定,則可以接管子窗口的WndProc進行一些“過濾”。 通常,這是使用PreTranslateMessage()虛擬函數完成的。

您需要使用通知,這意味着發送WM_NOTIFY消息,並在附加結構中指定您自己的代碼。 然后,您的父控件可以處理消息ON_NOTIFY ,或者你可以得到主人類來處理消息本身ON_NOTIFY_REFLECT

您始終可以避免使用Windows \\ MFC消息傳遞體系結構,而使用基於事件的系統。 Boost.Signals2之類的東西。 在我們的應用程序中,我們混合使用WM_NOTIFY消息和Boost.Signals2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM