2011-12-14 16 views
1

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

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

しかし、私はすべてのメッセージを手動で扱うつもりはありません。したがって、私がCStaticの代わりにCWndから自分のコントロールを拡張すると、メッセージは渡されますか? FORWARD_NOTIFICATIONS()はMFCで使用できますか?そうでない場合は、必要に応じてメッセージを処理するために中間クラスを拡張することにします。あなたが知っている他の解決策?

答えて

0

通知を使用する必要があります。これは、添付の構造で指定された独自のコードを使用してWM_NOTIFYメッセージを送信することを意味します。親コントロールはON_NOTIFYでメッセージを処理することができます。または、メッセージ自体を扱うオーナークラスをON_NOTIFY_REFLECTで取得できます。

いつもWindows \ MFCメッセージングアーキテクチャを回避し、代わりにイベントベースのシステムを使用できます。 Boost.Signals2のようなものです。我々のアプリケーションでは、WM_NOTIFYメッセージとBoost.Signals2が混在しています。

1

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

いくつかのウィンドウは、通常、WM_NOTIFYメッセージの形式で、またはBN_CLICKEDのような '特別な'メッセージのボタンのように、両親にメッセージを送信します。

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

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

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

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

+0

私が欲しかったのは、親によって処理されるメッセージが祖父母によって処理されることでした。コントロールによって処理されるメッセージはそのまま保持されます。私のコンテナが、親に送信されるメッセージに対して透過的であることを望みました。 – webdreamer

+0

OK私は今理解しています。これは「簡単に」行うことはできません。「簡単に」とは、マクロのみを使用することを意味します。親(コンテナ)のメッセージをキャッチし、手動でコンテナの親に再送信する必要があります。これの多くは、BN_CLICKEDメッセージを1つの関数にインターセプトするなど、自動化することができ、その1つの関数で親に再送信させることができます。そうすれば、ボタンを追加するたびにコンテナを更新する必要がなくなります。 – Roel

+0

BN_CLICKEDメッセージを処理してそのメッセージを親に送信できますか?どうやって?あるいは、一般的なNotiftyを送って、親のメッセージを離れて伝えなければならないのですか? – webdreamer

関連する問題