2009-06-10 9 views
3

CWndから派生したクラスのインスタンスでは、可能なメッセージごとに個別のハンドラとメッセージマッピングを記述することなく、すべてのMFCメッセージを別のオブジェクトに転送(リダイレクト)することは可能ですか?具体的には、私はすべての未処理のWM_メッセージを別のオブジェクトに転送したいと思います。これが不可能な場合は、オブジェクトが他のオブジェクト内で発生するイベントをリッスンすることは可能ですか?それが私の質問を明確にするのに役立つなら、私は詳細を提供することができます。MFCメッセージを別のオブジェクトにリダイレクトする方法は?

ありがとうございました。

答えて

4

MFCよりも少し低い目標を設定する必要があります。ウィンドウのPreTranslateMessageメソッドをオーバーライドして、メッセージを直接処理する必要があります。

メインメッセージループを作成したら、アプリで処理するものと、別のものに送信/投稿するものを選択して選択できます。メッセージを送信する場合は、SendMessageTimeout(...)をお勧めします。

+0

ありがとうございます。 PreTranslateMessage()をオーバーライドすることは、まさに私が必要とした解決策でした。 – Geoff

+0

PreTranslateMessageを意味しましたか? Geoffのコメントからあなたはそうだったようです。 AFAIK PreProcessMessageはdotnetです。 PreTranslateMessageはMFC関数です。私は、混乱を避けるために答えを編集することが役立つと思います。 –

+0

ありがとう!編集しました。 –

1

サブクラス化と思っています。

+0

SubclassWindow()を呼び出すことは私の実装ではうまくいきませんでしたが、今後の使用には注意が必要です。ありがとう。 – Geoff

1

いいえ、あなたは本当にあなたが求めているものを行うことはできませんが、あなたはおそらくする必要はありません。メッセージマップを作成するときは、適用するクラスとそのクラスの基本クラスの両方を指定します。派生クラスに特定のメッセージのメッセージマップエントリがない場合、MFCはメッセージマップで基本クラスをチェックします。基本クラスのメッセージマップにエントリがない場合は、その基本クラスのメッセージマップをチェックします。

たとえば、一般的な機能を備えた一連のダイアログがあるとします。あなたはthuslyあなたのクラスをレイアウトできます。

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() 

同じようなのCWnd、CViewの、CFRAMEなど他のすべてのHWNDベースのクラスに適用され、というように。コマンドメッセージを扱っているなら、いくつかの追加オプションがあります。

0

私はコメントを投稿できないようですが、これを回答として投稿します。私はいくつかの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を経由していたので、基本的にすべてのWM_COMMANDメッセージを転送するOnCommand関数をオーバーライドしたBradの答えに続いて問題が発生しました。誰かが同じ問題を抱えている場合に備えて私はこれを投稿しています。

助けてくれてありがとうBrad、あなたの答えは私を助けました。

関連する問題