ホーム WTL Mobile
WTLのメッセージマップ
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2009/04/18
PR
 前回はATLによって提供されるメッセージマクロについて説明しましたが、 WTLもメッセージマクロを用意しており、atlcrack.hヘッダで定義されています。 以下にWTLのメッセージマクロを使用した例を示します。

class CMainWindow : public CWindowImpl<CMainWindow>
{
    // WTLのメッセージマップ
    BEGIN_MSG_MAP(CMainWindow)
        MSG_WM_PAINT(OnPaint)
        MSG_WM_DESTROY(OnDestroy)
    END_MSG_MAP()

    void OnPaint(CDCHandle /*dc*/){
        // WM_PAINTメッセージへの応答処理
    }

    void OnDestroy(){
        // WM_DESTROYメッセージへの応答処理
    }
};
			

このようにWTLには各メッセージ専用のメッセージマクロがあり、 メッセージハンドラ関数にはメッセージ固有の引数が渡されます。

 WTLには、ATLが用意する汎用メッセージハンドラマクロ、WM_COMMANDメッセージハンドラマクロ、 WM_NOTIFYメッセージハンドラマクロの拡張版が用意されています。

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

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

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

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

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

uMsgはメッセージを識別し、wParamとlParamはメッセージパラメータです。 メッセージパラメータの内容はメッセージの種類によって変わります。

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

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

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

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

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

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

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

void CommandHandler(UINT uNotifyCode, int nID, CWindow wndCtl);
			

uNotifyCodeは通知コード、nIDはWM_COMMANDメッセージを送信したコントロールの識別子、 wndCtlはWM_COMMANDメッセージを送信したコントロールウィンドウです。

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

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

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

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

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

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

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

LRESULT NotifyHandler(LPNMHDR pnmh);
			

pnmhはNMHDR構造体へのポインタです。

メッセージ処理の終了通知
 ところで、ATLのメッセージマクロを使用してる場合は、 ハンドラ関数のプロトタイプに処理を終えたかどうかを通知するフラグがありました。 次に示すのはATL版メッセージハンドラ関数のプロトタイプです。

// bHandledが処理を終えたかどうかを通知するフラグ
LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
			

しかし、WTLのメッセージハンドラ関数にはそのようなフラグが用意されていません。

WTLでは、メッセージハンドラ関数内でSetMsgHandled() という関数を呼び出すことによって、メッセージの処理を終えたかどうかを通知します。 SetMsgHandled()の引数にtrueを渡した場合はメッセージの処理を終えたことを意味し、 falseを渡した場合はメッセージマップ内でさらにこのメッセージ用のハンドラがないかどうか検索することを意味します。 WTLでは基本的にメッセージハンドラ関数の呼び出し前にtrueが設定されているため、 メッセージマップを検索させたい場合だけ明示的にfalseを設定する必要があります。