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

ATL3.0でWTLのメッセージマクロを使用するには、メッセージマップを BEGIN_MSG_MAPからBEGIN_MSG_MAP_EXに変更する必要があります。

ATL7.0/7.1でWTLのメッセージマクロを使用する場合は、 CWindowImpl/CDialogImplクラスの派生クラスではBEGIN_MSG_MAPのままで良いですが、 CWindowImpl/CDialogImplクラスの派生クラスでない場合は、 BEGIN_MSG_MAP_EXに変更する必要があります。

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

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

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

このようにWTLには各メッセージ専用のメッセージマクロがあり、 メッセージハンドラ関数には不要な引数がありません。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

void CommandHandler(UINT uNotifyCode, int nID, HWND hWndCtl);
			

uNotifyCodeは通知コード、nIDはコマンドを送信しているコントロールの識別子、 hWndCtlはコマンドを送信しているコントロールのハンドルです。

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

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

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

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

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

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

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

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を設定する必要があります。