2009-06-10 23 views
3

在從CWnd派生類的實例中,是否可以將所有MFC消息轉發(重定向)到另一個對象,而無需爲每個可能的消息編寫單獨的處理程序和消息映射?具體來說,我想將所有未處理的WM_消息轉發給另一個對象。如果這是不可能的,那麼對象是否有可能監聽其他對象內發生的事件?如果這能幫助澄清我的問題,我可以提供詳細信息。如何將MFC消息重定向到另一個對象?

謝謝。

回答

4

你需要瞄準比MFC低一點。您應該重寫窗口的PreTranslateMessage方法並直接處理消息。

一旦你有主要的消息循環,你可以挑選哪些應用程序處理,哪些是發送/發佈到另一個。如果您選擇發送郵件,我建議SendMessageTimeout(...)

+0

謝謝;重寫PreTranslateMessage()正是我需要的解決方案。 – Geoff 2009-06-11 17:26:09

+0

你的意思是PreTranslateMessage?從Geoff的評論看來,你似乎做到了。 AFAIK PreProcessMessage是dotnet。 PreTranslateMessage是一個MFC函數。我認爲編輯答案以避免混淆會很有幫助。 – 2011-06-30 06:32:39

1

不,你不能真正做你問什麼,但你可能沒有。 (有關您的問題的更多詳細信息可能是按順序排列的。)創建消息映射時,可以指定應用的類和該類的基類。如果您的派生類沒有特定消息的消息映射條目,MFC將檢查基類的消息映射。如果基類消息映射沒有條目,它將檢查消息映射的基類,依此類推。

例如,假設您有一堆具有通用功能的對話框。你可能正是如此佈置您的類:

class CMyBaseDialog : public CDialog { 
    DECLARE_MESSAGE_MAP(); 
} 

BEGIN_MESSAGE_MAP(CMyBaseDialog, CDialog) 
    // Handle any common messages here... 
END_MESSAGE_MAP() 

class CDerivedDialog : public CMyBaseDialog { 
    DECLARE_MESSAGE_MAP(); 
} 

BEGIN_MESSAGE_MAP(CDerivedDialog, CMyBaseDialog) 
    // Handle any specific messages here... 
END_MESSAGE_MAP() 

這同樣適用於所有其他基於HWND類,如的CWnd,CView中,C框架,等等。如果你專門處理命令消息,那麼你有一些額外的選擇。

0

好吧,因爲我似乎無法發表評論我會張貼這個答案。我在Brad的回答中遇到了一些問題,其中一些WM_COMMANd消息未通過PreTranslateMessage函數路由(請參閱我的問題How to stop MFC from disabling my controls if I don't declare a message map entry for it's corresponding command?的回答),但是通過OnCommand,所以基本上我重寫了OnCommand函數以轉發所有WM_COMMAND消息。我發佈這個以防萬一誰得到同樣的問題。

無論如何,感謝幫助布拉德,你的答案幫了我很多。

相關問題