ホーム ATL/WTL
ATLのメッセージマップ
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2003/12/17
PR
 ATL/WTLプログラミングでは、メッセージとそれに対するハンドラ関数をメッセージマップによって 結び付けます。

class CMyWindow : public CWindowImpl<CMyWindow>
{
    // メッセージマップ
    BEGIN_MSG_MAP(CMyWindow)
        MESSAGE_HANDLER(WM_PAINT, OnPaint)
        MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    END_MSG_MAP()

    LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
        // WM_PAINTメッセージへの応答処理
    }

    LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
        // WM_DESTROYメッセージへの応答処理
    }
};
			

 ウィンドウがメッセージを受け取ると、メッセージマップの先頭から順に検索されるので、 頻繁に使用されるメッセージを最初の方に記述しておくと良いでしょう。 メッセージマップ中に対応するメッセージマクロが見つからなければ、メッセージは デフォルトウィンドウプロシージャに渡されます。

 ATLが用意するメッセージマクロは大きく分けて3種類あります。それはメッセージハンドラマクロ、 コマンドハンドラマクロ、通知ハンドラマクロの3つです。

メッセージハンドラマクロ
 メッセージハンドラマクロはすべてのメッセージを対象とします。 メッセージハンドラマクロには次の2つがあります。

  • MESSAGE_HANDLER(メッセージ名, ハンドラ名)
    指定されたメッセージをハンドラ関数にマップします。

  • MESSAGE_RANGE_HANDLER(開始位置のメッセージ名, 終了位置のメッセージ名, ハンドラ名)
    連続した範囲の複数のメッセージをハンドラにマップします。

メッセージハンドラ関数のプロトタイプを以下に示します。

LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
			

uMsgはメッセージを識別し、wParamとlParamはメッセージパラメータです。 メッセージパラメータの内容はメッセージの種類によって変わります。 bHandledはメッセージの処理を終えたかどうかを示すフラグです。 bHandledがハンドラ関数の中でFALSEに設定されていると、メッセージマップの残りの部分で、 そのメッセージのためのハンドラが別にないかどうかが検索されます。 bHandledはハンドラ関数の呼び出し前にTRUEに設定されるので、 ハンドラ関数がbHandledを明示的にFALSEに設定しない限り、 それ以上のハンドラ検索処理は行われません。

コマンドハンドラマクロ
 コマンドハンドラマクロはコマンドメッセージ(WM_COMMAND)を対象とします。 コマンドハンドラマクロには次の4つがあります。

  • COMMAND_HANDLER(ID, 通知コード, ハンドラ名)
    指定されたコントロールからの指定された通知コードを持つコマンドメッセージをハンドラ関数にマップします。

  • COMMAND_ID_HANDLER(ID, ハンドラ名)
    指定されたコントロールからの任意の通知コードを持つコマンドメッセージをハンドラ関数にマップします。

  • COMMAND_CODE_HANDLER(通知コード, ハンドラ名)
    任意のコントロールからの指定された通知コードを持つコマンドメッセージをハンドラ関数にマップします。

  • COMMAND_RANGE_HANDLER(開始位置のメッセージ名, 終了位置のメッセージ名, ハンドラ名)
    連続した範囲のコントロールからのコマンドメッセージをハンドラ関数にマップします。

コマンドハンドラ関数のプロトタイプを以下に示します。

LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
			

wNotifyCodeは通知コード、wIDはコマンドを送信しているコントロールの識別子、 hWndCtlはコマンドを送信しているコントロールのハンドル、bHandledは前述のフラグです。

通知ハンドラマクロ
 通知ハンドラマクロは通知メッセージ(WM_NOTIFY)を対象とします。 通知ハンドラマクロには次の4つがあります。

  • NOTIFY_HANDLER(ID, 通知コード, ハンドラ名)
    指定されたコントロールからの指定された通知コードを持つ通知メッセージをハンドラ関数にマップします。

  • NOTIFY_ID_HANDLER(ID, ハンドラ名)
    指定されたコントロールからの任意の通知コードを持つ通知メッセージをハンドラ関数にマップします。

  • NOTIFY_CODE_HANDLER(通知コード, ハンドラ名)
    任意のコントロールからの指定された通知コードを持つ通知メッセージをハンドラ関数にマップします。

  • NOTIFY_RANGE_HANDLER(開始位置のメッセージ名, 終了位置のメッセージ名, ハンドラ名)
    連続した範囲のコントロールからの通知メッセージをハンドラ関数にマップします。

通知ハンドラ関数のプロトタイプを以下に示します。

LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
			

idCtrlは通知を送信しているコントロールの識別子、pnmhはNMHDR構造体へのポインタ、 bHandledは前述のフラグです。