5

ドキュメント読みました。次のように書かれています。

ALT_MSG_MAPATL は、マクロで宣言された代替メッセージ マップをサポートします。
各代替メッセージ マップは、 に渡す一意の番号によって識別されますALT_MSG_MAP
代替メッセージ マップを使用すると、複数のウィンドウのメッセージを 1 つのマップで処理できます。
デフォルトでは、CWindowImplは代替メッセージ マップを使用しないことに注意してください。
このサポートを追加するには、派生クラスのWindowProcメソッドをオーバーライドし、メッセージ マップ識別子を使用して呼び出します。CWindowImplProcessWindowMessage

WTL を見ると、次のようなメッセージ マップが表示されます。

BEGIN_MSG_MAP(CCommandBarCtrlImpl)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
    ...
ALT_MSG_MAP(1)   // Parent window messages
    MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup)
    ...
ALT_MSG_MAP(2)   // MDI client window messages
    // Use CMDICommandBarCtrl for MDI support
ALT_MSG_MAP(3)   // Message hook messages
    MESSAGE_HANDLER(WM_MOUSEMOVE, OnHookMouseMove)
    ...
END_MSG_MAP()

しかし、私は理解していません:

  • 彼らがどのように呼ばれるか。(コードは代替メッセージ マップの存在をどのように認識しますか?)

  • デフォルトのメッセージ マップとの違い。それらはすべて、同じウィンドウに対して同じ種類のメッセージを処理しているように見えます...

  • なぜ便利なのか。(とにかく、それらはすべて同じウィンドウ用ではありませんか?)

代替メッセージマップが何をするかについて、誰かがより良い説明を持っていますか?
(なぜそれらが発明されたのかについての動機は非常に役に立ちます。)

4

1 に答える 1

5

代替メッセージ マップを使用すると、他のウィンドウのメッセージに対して同じマップ内でメッセージ ハンドラーを定義できます。上の地図を見てください。

BEGIN_MSG_MAP(CCommandBarCtrlImpl)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
    ...
ALT_MSG_MAP(1)   // Parent window messages
    MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup)
    ...

これは classCCommandBarCtrlImplで、ウィンドウ ハンドルが関連付けられていますHWND。すべてのメッセージはデフォルト マップを通過します (上記の行ALT_MSG_MAP(1))。

なんらかの理由ではなく、クラスは親のメッセージを処理したいと考えています。メンバー クラス変数を使用してそれをサブクラス化し、メッセージ ハンドラーを定義する必要があるところまで来ます。独自のウィンドウ メッセージと混同されるため、それらを同じマップに直接追加することはできません。

ここで、代替マップが役に立ちます。親ウィンドウ メッセージは、代替メッセージ マップ番号 1 にルーティングされます。

独自のウィンドウのメッセージのみを処理する場合は、代替マップは必要ありません。

于 2012-08-08T11:44:10.550 に答える