2013-03-06 18 views
3

當創建一個標準窗口控制(例如一個"EDIT"控制),其WNDPROC被定義爲窗口類的一部分(即"EDIT"具有被設計以使一個特定WNDPROC窗口顯示&表現爲編輯控制)。如何將消息路由到控制的標準WNDPROC

MFC允許你通過它們的包裝類(如CEdit)與這些控件進行交互,包裝"EDIT"窗口控件的專用消息。

MFC進一步允許你綁定一個"EDIT"窗口到C++的CEdit的子類的實例,假設一個CMyEdit,在這裏可以重寫繼承的CEditCWnd虛函數,並且可以定義一個消息表來訪問/覆蓋發送到窗口實例本身的消息。

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根本沒有這方面的任何具體的通用結構?

+0

有些東西告訴我,我們需要@RaymondChen在這個問題。 – 2013-03-06 17:26:58

+1

或@Joseph M. Newcomer – Mordachai 2013-03-06 18:35:32

回答

2

你做得對。 CWnd :: DefWindowProc()使用WINDOWPROC你從子類,並將調用編輯窗口的窗口過程。

+0

在這個特定的實例中,他將如何區別它以調用Default()? – 2013-03-06 17:25:57

+0

看看wincore.cpp,默認和DefWindowProc()在我的例子中是相同的,因爲我將相同的參數傳遞給DefWindowProc()作爲Default()會,並且默認調用DefWindowProc()得到完全相同的結果。 – Mordachai 2013-03-06 18:28:08

+0

我對ON_MESSAGE作爲消息接收器與其他具有BOOL結果的ON_WM_xxx之間的區別比較困惑,它表示您的處理程序是處理消息還是應該傳播消息錶鏈。或者我甚至會如何爲我的例子完成這個任務(即,如果我的子類想要消息處理程序鏈 - 如何?)。 並驗證我的示例調用MFC的WNDPROC子類(掛鉤)之前的WNDPROC。 – Mordachai 2013-03-06 18:28:47

3

調用Default()將導致響應消息發生時發生的「正常」處理。我不完全清楚你想要達到的目標,但在我看來,撥打Default()就是你想要做的。

如果你看(從CWndCEdit派生類和處理程序)很多從CWnd處理Windows消息處理程序,你會看到,他們稱之爲Default()

對智者來說,Default()實際上會使用原始信息的任何參數 - 你不能改變它們。

+0

在抽象/普通級別,是Default()將執行「正常」的事情。聽起來像這意味着將調用MFC鉤住的WNDPROC,而不是調用:: DefWindowProc(我們希望窗口類「EDIT」的WNDPROC被調用,而不是全局通用默認窗口過程!) 但是,我想就此作出確認,並澄清如果我的ON_MESSAGE處理程序想要拋出,將導致MFC消息錶鏈中的下一個消息處理程序被調用的正確方法是什麼? – Mordachai 2013-03-06 18:31:45