1

MFC でメッセージ ルーティングがどのように機能するかを理解しようとしていますが、それに関していくつか質問があります。CWnd を拡張するコントロールを想像してください。私の最初の質問は、そのコントロール内のすべてのメッセージが親コントロールに渡されるかどうかです。

SS_NOTIFY スタイルを設定したときに特定のメッセージのみを渡す CStatic では、それが起こらないことを私は知っています。それが CStatic に固有のものであるか、すべてのコントロールで発生するかを理解しようとしています。具体的には、レイアウトを定義することのみを目的として、いくつかの子コントロールを持つコントロールを作成しようとしています。子コントロールのすべてのメッセージが、この中間コントロールの親によって処理されるようにしたかったのです。たとえば、このレイアウト コントロールに子ボタンがある場合、ボタンがクリックされると、メッセージが親に送信されて処理されます。

ただし、すべてのメッセージを手動で処理するつもりはありません。では、CStatic ではなく CWnd から制御を拡張すると、メッセージは渡されますか? FORWARD_NOTIFICATIONS() は MFC で使用できますか? そうでない場合は、中間クラスを拡張して、必要に応じてメッセージを処理したいと思います。あなたが知っている他の解決策はありますか?

4

2 に答える 2

1

メッセージはウィンドウ自体に送信されます。

一部のウィンドウは、通常はWM_NOTIFYメッセージの形式で、または(ボタンの場合のように)BN_CLICKEDのような「特別な」メッセージの形式でメッセージを親に送信します。

MFCには、ウィンドウがそれらのメッセージをウィンドウ自体に送り返すシステム(「リフレクション」システム)があるため、親コントロールを使用するのではなく、コントロール内のメッセージを処理できます。

これは、抽象的には大まかにどのように機能するかです。あなたが望むこと(親コントロールにすべての子コントロールに送信されるすべてのメッセージを処理させる)は、一般的にあなたがそれを行うべき方法ではありません。たとえば、子ウィンドウのすべてのWM_PAINTを親に送信する必要はありません。

やりたいこと(ボタンクリックの処理)が異なります。ボタンのクリックは、BN_CLICKEDの形式でボタンによって「放出」されます。それらはとにかく親によって処理されます。

それでも決心している場合は、子ウィンドウのWndProcを引き継いで、「フィルタリング」を行うことができます。通常、これはPreTranslateMessage()仮想関数を使用して行われます。

于 2011-12-21T10:16:59.633 に答える
0

通知を使用する必要があります。つまり、付属の構造体で指定された独自のコードを使用してWM_NOTIFYメッセージを送信する必要があります。その後、親コントロールは でメッセージを処理できます。または、所有者クラスにON_NOTIFY_REFLECTON_NOTIFYでメッセージ自体を処理させることができます。

Windows\MFC メッセージング アーキテクチャを常に回避し、代わりにイベント ベースのシステムを使用できます。Boost.Signals2のようなもの。私たちのアプリケーションでは、WM_NOTIFYメッセージと Boost.Signals2 を組み合わせて使用​​しています。

于 2011-12-14T13:13:10.707 に答える