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

class CMainWindow : public CWindowImpl<CMainWindow>
{
    // メッセージマップ
    BEGIN_MSG_MAP(CMainWindow)
        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が用意するメッセージマクロには大きく分けて、汎用メッセージハンドラマクロ、 WM_COMMANDメッセージハンドラマクロ、WM_NOTIFYメッセージハンドラマクロの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メッセージハンドラマクロ
 WM_COMMANDメッセージハンドラマクロはWM_COMMANDメッセージを対象とします。 WM_COMMANDメッセージハンドラマクロには次の5種類があります。

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

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

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

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

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

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

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

wNotifyCodeは通知コード、wIDはWM_COMMANDメッセージを送信したコントロールの識別子、 hWndCtlはWM_COMMANDメッセージを送信したコントロールのハンドル、bHandledは前述のフラグです。

WM_NOTIFYメッセージハンドラマクロ
 WM_NOTIFYメッセージハンドラマクロはWM_NOTIFYメッセージを対象とします。 WM_NOTIFYメッセージハンドラマクロには次の5種類があります。

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

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

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

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

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

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

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

idCtrlはWM_NOTIFYメッセージを送信したコントロールの識別子、pnmhはNMHDR構造体へのポインタ、 bHandledは前述のフラグです。