CWndから派生したクラスのインスタンスでは、可能なメッセージごとに個別のハンドラーとメッセージマッピングを記述せずに、すべてのMFCメッセージを別のオブジェクトに転送(リダイレクト)することは可能ですか?具体的には、未処理のWM_メッセージをすべて別のオブジェクトに転送したいと思います。これが不可能な場合、オブジェクトが他のオブジェクト内で発生するイベントをリッスンすることは可能ですか?それが私の質問を明確にするのに役立つならば、私は詳細を提供することができます。
ありがとう。
MFCより少し低い位置を狙う必要があります。ウィンドウのPreTranslateMessageメソッドをオーバーライドして、メッセージを直接処理する必要があります。
メインメッセージループができたら、アプリで処理するものと、別のアプリに送信/投稿するものを選択できます。メッセージを送信することを選択した場合は、SendMessageTimeout(...)をお勧めします
サブクラス化が必要だと思います。
いいえ、あなたはあなたが求めていることを実際に行うことはできませんが、おそらくあなたはそうする必要はありません。(問題の詳細が整理されている場合があります。)メッセージマップを作成するときは、メッセージマップを適用するクラスと、そのクラスの基本クラスの両方を指定します。派生クラスに特定のメッセージのメッセージマップエントリがない場合、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()
同じことが、CWnd、CView、CFrameなどの他のすべてのHWNDベースのクラスにも当てはまります。特にコマンドメッセージを扱っている場合は、いくつかの追加オプションがあります。
コメントを投稿できないようですので、回答として投稿します。一部のWM_COMMANdメッセージがPreTranslateMessage関数を介してルーティングされないというBradの回答に続いて問題が発生しました(対応するコマンドのメッセージマップエントリを宣言しない場合、MFCがコントロールを無効にしないようにする方法についての私の回答を参照してください) 。 OnCommandを介していたため、基本的にOnCommand関数をオーバーライドして、すべてのWM_COMMANDメッセージも転送しました。誰かが同じ問題を抱えている場合に備えて、これを投稿しています。
とにかく助けブラッドに感謝します、あなたの答えは私を大いに助けました。