當創建一個標準窗口控制(例如一個"EDIT"
控制),其WNDPROC
被定義爲窗口類的一部分(即"EDIT"
具有被設計以使一個特定WNDPROC
窗口顯示&表現爲編輯控制)。如何將消息路由到控制的標準WNDPROC
MFC允許你通過它們的包裝類(如CEdit
)與這些控件進行交互,包裝"EDIT"
窗口控件的專用消息。
MFC進一步允許你綁定一個"EDIT"
窗口到C++的CEdit的子類的實例,假設一個CMyEdit
,在這裏可以重寫繼承的CEdit
和CWnd
虛函數,並且可以定義一個消息表來訪問/覆蓋發送到窗口實例本身的消息。
有CWnd::Default(),它調用this-> DefWndProc與當前的消息參數。這看起來是爲它所關聯的HWND查找WNDPROC
。那麼這是正確的答案:調用DefWndProc()(或者同樣,Default()),它將把它交給窗口控件的WNDPROC
?
顯然,這與其他消息表處理程序不同,它可以返回FALSE來指示它們沒有處理消息,並且MFC會自動將消息按類繼承層次結構發送到此消息的下一個消息處理程序,或者,我假設Default()由本地WNDPROC
處理?
如果我定義一個任意消息處理程序,譬如說WM_SETTEXT,什麼是傳遞到"EDIT"
WNDPROC
此消息的正確方法是什麼?
我也很想知道,如果有一種方法可以將消息傳遞給了用於處理超類(C++類層次結構)?許多OnXXX風格的處理程序確實有辦法這樣做,但是有沒有一種適用於ON_MESSAGE處理程序的機制?
class CDynamicMenuControlEdit : public CEdit
{
...
LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
...
}
BEGIN_MESSAGE_MAP(CDynamicMenuControlEdit, CEdit)
...
ON_MESSAGE(WM_SETTEXT, OnSetText)
...
END_MESSAGE_MAP()
LRESULT CDynamicMenuControlEdit::OnSetText(
WPARAM wParam, // not used; must be zero
LPARAM lParam // window-text string (LPCTSTR)
)
{
if (m_bHasFocus)
{
// do normal thing
// !!! THIS IS MY QUESTION: IS THIS CALLING EDIT's WNDPROC, or ::DefWinProc()? !!!
return DefWindowProc(WM_SETTEXT, wParam, lParam);
}
...
}
澄清
可以具有在C++水平多個MFC子類 -
所以C繼承繼承乙A,其中A是一個MFC類(例如CEdit
)。
每個那些可以具有的MFC消息表 - 即BEGIN_MESSAGE_MAP
... END_MESSAGE_MAP
其可各具有用於任意窗口消息的處理程序,如WM_MESSAGE(WM_SETTEXT, OnSetText)
- 這OnSetText
構件不一定是虛擬 - 只是靜態部件(每個MFC子類可以以任意方式路由該消息)。
我的問題是 - 因爲WM_MESSAGE
調度條目沒有返回值,我怎麼讓MFC來遞迴真正的Windows「編輯」類的前走上從C MFC調度表,B到A WndProc的?
或打算在MFC設計級別所有這些條目不被走啊?即最分層的調度程序是唯一被調用的?如果它希望利用繼承的成員具有手動打這通電話 - MFC根本沒有這方面的任何具體的通用結構?
有些東西告訴我,我們需要@RaymondChen在這個問題。 – 2013-03-06 17:26:58
或@Joseph M. Newcomer – Mordachai 2013-03-06 18:35:32