3

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

ありがとう。

4

4 に答える 4

4

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

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

于 2009-06-10T21:03:40.113 に答える
1

サブクラス化が必要だと思います。

于 2009-06-10T21:05:51.107 に答える
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()

同じことが、CWnd、CView、CFrameなどの他のすべてのHWNDベースのクラスにも当てはまります。特にコマンドメッセージを扱っている場合は、いくつかの追加オプションがあります。

于 2009-06-10T21:08:02.210 に答える
0

コメントを投稿できないようですので、回答として投稿します。一部のWM_COMMANdメッセージがPreTranslateMessage関数を介してルーティングされないというBradの回答に続いて問題が発生しました(対応するコマンドのメッセージマップエントリを宣言しない場合、MFCがコントロールを無効にしないようにする方法についての私の回答を参照してください) 。 OnCommandを介していたため、基本的にOnCommand関数をオーバーライドして、すべてのWM_COMMANDメッセージも転送しました。誰かが同じ問題を抱えている場合に備えて、これを投稿しています。

とにかく助けブラッドに感謝します、あなたの答えは私を大いに助けました。

于 2009-10-03T14:04:00.203 に答える