メッセージ マップ マクロ (MFC)

メッセージ マップをサポートするために、MFC には次のマクロが用意されています。

メッセージ マップ宣言とデマーケーション マクロ

名前 説明
DECLARE_MESSAGE_MAP メッセージ マップをクラスで使用して、メッセージを関数にマップすることを宣言します (クラス宣言で使用する必要があります)。
BEGIN_MESSAGE_MAP メッセージ マップの定義を開始します (クラス実装で使用する必要があります)。
BEGIN_TEMPLATE_MESSAGE_MAP 1 つのテンプレート引数を含むクラス型でメッセージ マップの定義を開始します。
END_MESSAGE_MAP メッセージ マップの定義を終了します (クラス実装で使用する必要があります)。

メッセージ マッピング マクロ

名前 説明
ON_COMMAND 指定したコマンド メッセージを処理する関数を示します。
ON_COMMAND_EX 指定したコマンド メッセージを処理する関数を示します。
ON_CONTROL 指定したコントロール通知メッセージを処理する関数を示します。
ON_MESSAGE ユーザー定義メッセージを処理する関数を示します。
ON_OLECMD DocObject またはそのコンテナーからメニュー コマンドを処理する関数を示します。
ON_REGISTERED_MESSAGE 登録済みのユーザー定義メッセージを処理する関数を示します。
ON_REGISTERED_THREAD_MESSAGE CWinThread クラスがある場合に、登録されたユーザー定義メッセージを処理する関数を示します。
ON_THREAD_MESSAGE CWinThread クラスがある場合に、ユーザー定義メッセージを処理する関数を示します。
ON_UPDATE_COMMAND_UI 指定したユーザー インターフェイス更新コマンド メッセージを処理する関数を示します。

メッセージ マップ範囲マクロ

名前 説明
ON_COMMAND_RANGE マクロの最初の 2 つのパラメーターで指定されたコマンド ID の範囲を処理する関数を示します。
ON_UPDATE_COMMAND_UI_RANGE マクロに対する最初の 2 つのパラメーターで指定されたコマンド ID の範囲を処理する更新ハンドラーを示します。
ON_CONTROL_RANGE 2 番目と 3 番目のパラメーターで指定されたコントロール ID の範囲からマクロへの通知を処理する関数を示します。 最初のパラメーターは、 BN_CLICKEDなどの制御通知メッセージです。

メッセージ マップ、メッセージ マップ宣言および区分マクロ、およびメッセージ マッピング マクロの詳細については、「 Message Maps および Message Handling and Mapping Topicsを参照してください。 メッセージ マップ範囲の詳細については、「メッセージ マップ範囲の Handlersを参照してください。

BEGIN_MESSAGE_MAP

メッセージ マップの定義を開始します。

構文

BEGIN_MESSAGE_MAP( theClass, baseClass )

パラメーター

theClass
メッセージ マップを持つクラスの名前を指定します。

baseClass
theClassの基底クラスの名前を指定します。

解説

クラスのメンバー関数を定義する実装 (.cpp) ファイルで、 BEGIN_MESSAGE_MAP マクロを使用してメッセージ マップを開始し、各メッセージ ハンドラー関数のマクロ エントリを追加し、 END_MESSAGE_MAP マクロを使用してメッセージ マップを完成させます。

メッセージ マップの詳細については、「 Message Maps」を参照してください。

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
   ON_WM_CREATE()
END_MESSAGE_MAP()

要件

ヘッダー: afxwin.h

BEGIN_TEMPLATE_MESSAGE_MAP

1 つのテンプレート引数を含むクラス型でメッセージ マップの定義を開始します。

構文

BEGIN_TEMPLATE_MESSAGE_MAP( theClass, type_name, baseClass )

パラメーター

theClass
メッセージ マップを持つクラスの名前を指定します。

type_name
クラスに指定されたテンプレート パラメーターの名前。

baseClass
theClassの基底クラスの名前を指定します。

解説

このマクロは BEGIN_MESSAGE_MAP マクロに似ていますが、このマクロは 1 つのテンプレート引数を含むクラスを対象としています。

クラスのメソッド実装セクションで、 BEGIN_TEMPLATE_MESSAGE_MAP マクロを使用してメッセージ マップを開始し、標準メッセージ マップの場合と同様に、各メッセージ ハンドラー メソッドのマクロ エントリを追加します。 BEGIN_MESSAGE_MAP マクロと同様に、END_MESSAGE_MAP マクロを使用してテンプレート メッセージ マップを完成させます。

テンプレート クラスのメッセージ マップの実装の詳細については、「 方法: テンプレート クラスのメッセージ マップを作成するを参照してください。

要件

ヘッダー: afxwin.h

DECLARE_MESSAGE_MAP

クラスがメッセージ マップを定義することを宣言します。 プログラム内の各 CCmdTarget派生クラスは、メッセージを処理するためのメッセージ マップを提供する必要があります。

構文

DECLARE_MESSAGE_MAP( )

解説

クラス宣言の最後に DECLARE_MESSAGE_MAP マクロを使用します。 次に、クラスのメンバー関数を定義する.cpp ファイルで、 BEGIN_MESSAGE_MAP マクロ、各メッセージ ハンドラー関数のマクロ エントリ、および END_MESSAGE_MAP マクロを使用します。

Note

DECLARE_MESSAGE_MAP後にメンバーを宣言する場合は、新しいアクセスの種類 (publicprivate、またはprotected) を指定する必要があります。

メッセージ マップと DECLARE_MESSAGE_MAP マクロの詳細については、「 Message の処理とマッピングに関するトピックを参照してください。

class CMainFrame : public CMDIFrameWnd
{
   DECLARE_MESSAGE_MAP()

   // Remainder of class declaration omitted.

要件

ヘッダー: afxwin.h

END_MESSAGE_MAP

メッセージ マップの定義を終了します。

構文

END_MESSAGE_MAP( )

解説

メッセージ マップと END_MESSAGE_MAP マクロの詳細については、「 Message の処理とマッピングに関するトピックを参照してください。

要件

ヘッダー: afxwin.h

ON_COMMAND

このマクロは、コマンド メッセージをメンバー関数にマップします。

構文

ON_COMMAND( commandId, memberFxn )

パラメーター

commandId
コマンド ID。

memberFxn
コマンドがマップされるメッセージ ハンドラー関数の名前。

解説

メニュー項目やツール バー ボタンなどのコマンド ユーザー インターフェイス オブジェクトからのコマンド メッセージを処理する関数を示します。

コマンド ターゲット オブジェクトが、指定した ID を持つ Windows WM_COMMAND メッセージを受信すると、 ON_COMMAND はメッセージを処理するメンバー関数 memberFxn を呼び出します。

ON_COMMANDを使用して、1 つのコマンドをメンバー関数にマップします。 ON_COMMAND_RANGEを使用して、コマンド ID の範囲を 1 つのメンバー関数にマップします。 特定のコマンド ID と一致できるメッセージ マップ エントリは 1 つだけです。 つまり、1 つのコマンドを複数のハンドラーにマップすることはできません。 詳細と例については、「 Message の処理とマッピングに関するトピックを参照してください。

BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)
   ON_COMMAND(ID_MYCOMMAND, &CMFCListViewDoc::OnMycommand)
END_MESSAGE_MAP()

要件

ヘッダー: afxmsg_.h

ON_COMMAND_EX

拡張コマンド ハンドラー メンバー関数。

構文

ON_COMMAND_EX(commandId, memberFxn);

パラメーター

commandId
コマンド ID。

memberFxn
コマンドがマップされるメッセージ ハンドラー関数の名前。

解説

拡張形式のコマンド メッセージ ハンドラーは、高度な用途で使用できます。 ON_COMMAND_EX マクロは、このようなメッセージ ハンドラーに使用され、ON_COMMAND機能のスーパーセットを提供します。 拡張コマンド ハンドラーメンバー関数は、1 つのパラメーター(コマンド ID を含む UINT )を受け取り、 BOOLを返します。 戻り値は、コマンドが処理されたことを示すために TRUE する必要があります。それ以外の場合、ルーティングは他のコマンド ターゲット オブジェクトに引き続き適用されます。

詳細については、テクニカル ノート [TN006: メッセージ マップ]tm006-message-maps.md) を参照してください。

要件

ヘッダー ファイル: afxmsg_.h

ON_CONTROL

カスタム コントロール通知メッセージを処理する関数を示します。

構文

ON_CONTROL( wNotifyCode, commandId, memberFxn )

パラメーター

wNotifyCode
コントロールの通知コード。

commandId
コマンド ID。

memberFxn
コマンドがマップされるメッセージ ハンドラー関数の名前。

解説

コントロール通知メッセージは、コントロールから親ウィンドウに送信されるメッセージです。

メッセージ ハンドラー関数にマップする必要があるコントロール通知メッセージごとに、メッセージ マップにマクロ ステートメントが 1 つだけ ON_CONTROL 必要です。

詳細と例については、「 Message の処理とマッピングに関するトピックを参照してください。

要件

ヘッダー: afxmsg_.h

ON_MESSAGE

ユーザー定義メッセージを処理する関数を示します。

構文

ON_MESSAGE( message, memberFxn )

パラメーター

message
メッセージ ID。

memberFxn
メッセージがマップされるメッセージ ハンドラー関数の名前。

関数の型は afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM)する必要があります。

解説

ユーザー定義メッセージは、標準の Windows WM_MESSAGE メッセージではないメッセージです。 メッセージ ID を選択するときは、 WM_USER (0x0400) の範囲内の値を使用して、0xBFFFする0x7FFFまたは WM_APP (0x8000) を使用する必要があります。 メッセージ ID の詳細については、 WM_APPを参照してください。

メッセージ・ハンドラー関数にマップする必要があるユーザー定義メッセージごとに、メッセージ・マップ内に 1 つの ON_MESSAGE マクロ・ステートメントが存在する必要があります。

Note

ユーザー定義メッセージに加えて、 ON_MESSAGE は、あまり一般的でない Windows メッセージを処理します。 詳細については、「 Message Maps」を参照してください。

詳細と例については、「 Message の処理とマッピングに関するトピック および ユーザー定義ハンドラー」を参照してください。

#define WM_MYMESSAGE (WM_USER + 100)

BEGIN_MESSAGE_MAP(CMyWnd2, CWnd)
   ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()

// inside the class declaration
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

LRESULT CMyWnd2::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
   UNREFERENCED_PARAMETER(wParam);
   UNREFERENCED_PARAMETER(lParam);

   // Handle message here.

   return 0;
}

要件

ヘッダー: afxmsg_.h

ON_OLECMD

コマンド ディスパッチ インターフェイス IOleCommandTargetを介してコマンドをルーティングします。

構文

ON_OLECMD( pguid, olecmdid, commandId )

パラメーター

pguid
コマンドが属するコマンド グループの識別子。 標準グループには NULL を使用します。

olecmdid
OLE コマンドの識別子。

commandId
コマンドを発行するリソースまたはオブジェクトのメニュー ID、ツール バー ID、ボタン ID、またはその他の ID。

解説

IOleCommandTarget を使用すると、コンテナーは DocObject のユーザー インターフェイスに由来するコマンドを受け取り、コンテナーは同じコマンド ([新規作成]、[開く]、[SaveAs]、[ファイル] メニューの [印刷]、[編集] メニューのコピー、貼り付け、元に戻すなど) を DocObject に送信できます。

IOleCommandTarget は、OLE オートメーションの IDispatchよりも簡単です。 IOleCommandTarget は、ほとんど引数を持たない標準のコマンド セットに完全に依存し、型情報は関係しません (コマンド引数の場合も、型の安全性が低下します)。 引数を使用してコマンドをディスパッチする必要がある場合は、 COleServerDoc::OnExecOleCmdを使用します。

IOleCommandTarget標準メニュー コマンドは、次のマクロで MFC によって実装されています。

ON_OLECMD_CLEARSELECTION( )

[クリアの編集] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_CLEARSELECTION, ID_EDIT_CLEAR)

ON_OLECMD_COPY( )

[コピーの編集] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_COPY, ID_EDIT_COPY)

ON_OLECMD_CUT( )

[切り取り編集]コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_CUT, ID_EDIT_CUT)

ON_OLECMD_NEW( )

[新規ファイル] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_NEW, ID_FILE_NEW)

ON_OLECMD_OPEN( )

[ファイルを開く] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_OPEN, ID_FILE_OPEN)

ON_OLECMD_PAGESETUP( )

[ファイル ページのセットアップ] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_PAGESETUP, ID_FILE_PAGE_SETUP)

ON_OLECMD_PASTE( )

[貼り付けの編集] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_PASTE, ID_EDIT_PASTE)

ON_OLECMD_PASTESPECIAL( )

[特殊な貼り付けの編集] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_PASTESPECIAL, ID_EDIT_PASTE_SPECIAL)

ON_OLECMD_PRINT( )

[ファイルの印刷] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_PRINT, ID_FILE_PRINT)

ON_OLECMD_PRINTPREVIEW( )

[ファイル印刷プレビュー] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_PRINTPREVIEW, ID_FILE_PRINT_PREVIEW)

ON_OLECMD_REDO( )

[やり直しの編集] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_REDO, ID_EDIT_REDO)

ON_OLECMD_SAVE( )

[ファイルの保存] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_SAVE, ID_FILE_SAVE)

ON_OLECMD_SAVE_AS( )

[ファイルの名前を付けて保存] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_SAVEAS, ID_FILE_SAVE_AS)

ON_OLECMD_SAVE_COPY_AS( )

[ファイルの名前を付けて保存] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_SAVECOPYAS, ID_FILE_SAVE_COPY_AS)

ON_OLECMD_SELECTALL( )

[すべて選択] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_SELECTALL, ID_EDIT_SELECT_ALL)

ON_OLECMD_UNDO( )

[元に戻す編集] コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_UNDO, ID_EDIT_UNDO)

要件

ヘッダー: afxdocob.h

ON_REGISTERED_MESSAGE

Windows RegisterWindowMessage 関数は、システム全体で一意であることが保証される新しいウィンドウ メッセージを定義するために使用されます。

構文

ON_REGISTERED_MESSAGE( nMessageVariable, memberFxn )

パラメーター

nMessageVariable
登録済みのウィンドウ メッセージ ID 変数。

memberFxn
メッセージがマップされるメッセージ ハンドラー関数の名前。

解説

このマクロは、登録されたメッセージを処理する関数を示します。

詳細と例については、「 Message の処理とマッピングに関するトピックを参照してください。

static UINT NEAR WM_FIND = RegisterWindowMessage(_T("COMMDLG_FIND"));

BEGIN_MESSAGE_MAP(CMyWnd3, CWnd)
   ON_REGISTERED_MESSAGE(WM_FIND, OnFind)
END_MESSAGE_MAP()

要件

ヘッダー: afxmsg_.h

ON_REGISTERED_THREAD_MESSAGE

Windows RegisterWindowMessage 関数によって登録されたメッセージを処理する関数を示します。

構文

ON_REGISTERED_THREAD_MESSAGE(nMessageVariable, memberFxn )

パラメーター

nMessageVariable
登録済みのウィンドウ メッセージ ID 変数。

memberFxn
メッセージがマップされる CWinThreadメッセージ ハンドラー関数の名前。

解説

RegisterWindowMessage は、システム全体で一意であることが保証される新しいウィンドウ メッセージを定義するために使用されます。 ON_REGISTERED_THREAD_MESSAGECWinThread クラスがある場合は、ON_REGISTERED_MESSAGEの代わりに使用する必要があります。

要件

ヘッダー: afxmsg_.h

ON_THREAD_MESSAGE

ユーザー定義メッセージを処理する関数を示します。

構文

ON_THREAD_MESSAGE( message, memberFxn )

パラメーター

message
メッセージ ID。

memberFxn
メッセージがマップされる CWinThreadメッセージ ハンドラー関数の名前。

解説

ON_THREAD_MESSAGECWinThread クラスがある場合は、ON_MESSAGEの代わりに使用する必要があります。 ユーザー定義メッセージは、標準の Windows WM_MESSAGE メッセージではないメッセージです。 メッセージ・ハンドラー関数にマップする必要があるユーザー定義メッセージごとに、メッセージ・マップ内に 1 つの ON_THREAD_MESSAGE マクロ・ステートメントが存在する必要があります。

要件

ヘッダー: afxole.h

ON_UPDATE_COMMAND_UI

このマクロは、ユーザー インターフェイス更新コマンド メッセージを処理する関数を示します。

構文

ON_UPDATE_COMMAND_UI( messageId, memberFxn )

パラメーター

messageId
メッセージ ID。

memberFxn
メッセージがマップされるメッセージ ハンドラー関数の名前。

解説

メッセージ・ハンドラー関数にマップする必要があるユーザー・インターフェース更新コマンドごとに、メッセージ・マップ内に 1 つの ON_UPDATE_COMMAND_UI マクロ・ステートメントが存在する必要があります。

詳細と例については、「 Message の処理とマッピングに関するトピックを参照してください。

要件

ヘッダー: afxole.h

ON_COMMAND_RANGE

コマンド ID の連続した範囲を 1 つのメッセージ ハンドラー関数にマップするには、このマクロを使用します。

構文

ON_COMMAND_RANGE( id1, id2, memberFxn )

パラメーター

id1
コマンド ID の連続した範囲の先頭にあるコマンド ID。

id2
コマンド ID の連続した範囲の末尾にあるコマンド ID。

memberFxn
コマンドがマップされるメッセージ ハンドラー関数の名前。

解説

ID の範囲は id1 で始まり、 id2で終わります。

ON_COMMAND_RANGEを使用して、コマンド ID の範囲を 1 つのメンバー関数にマップします。 ON_COMMANDを使用して、1 つのコマンドをメンバー関数にマップします。 特定のコマンド ID と一致できるメッセージ マップ エントリは 1 つだけです。 つまり、1 つのコマンドを複数のハンドラーにマップすることはできません。 メッセージ範囲のマッピングの詳細については、「メッセージ マップ範囲の Handlersを参照してください。

メッセージ マップ範囲の自動サポートはないため、マクロを自分で配置する必要があります。

// The code fragment below shows how to use ON_COMMAND_RANGE macro
// to map a contiguous range of command IDs to a single message
// handler function (i.e. OnRangeCmds() in the sample below). In
// addition, it also shows how to use CheckMenuRadioItem() to check a
// selected menu item and makes it a radio item.

BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWnd)
   ON_COMMAND_RANGE(ID_COMMAND_RANGECMD1, ID_COMMAND_RANGECMD3, &CChildFrame::OnRangeCmds)
END_MESSAGE_MAP()

void CChildFrame::OnRangeCmds(UINT nID)
{
   CMenu* mmenu = AfxGetMainWnd()->GetMenu();
   CMenu* submenu = mmenu->GetSubMenu(5);
   submenu->CheckMenuRadioItem(ID_COMMAND_RANGECMD1, ID_COMMAND_RANGECMD3,
      nID, MF_BYCOMMAND);
}

要件

ヘッダー: afxmsg_.h

ON_UPDATE_COMMAND_UI_RANGE

コマンド ID の連続した範囲を 1 つの更新メッセージ ハンドラー関数にマップします。

構文

ON_UPDATE_COMMAND_UI_RANGE( id1, id2, memberFxn )

パラメーター

id1
コマンド ID の連続した範囲の先頭にあるコマンド ID。

id2
コマンド ID の連続した範囲の末尾にあるコマンド ID。

memberFxn
コマンドがマップされる更新メッセージ ハンドラー関数の名前。

解説

メッセージ ハンドラーを更新すると、コマンドに関連付けられているメニュー項目とツール バー ボタンの状態が更新されます。 ID の範囲は id1 で始まり、 id2で終わります。

メッセージ マップ範囲の自動サポートはないため、マクロを自分で配置する必要があります。

要件

ヘッダー: afxmsg_.h

ON_CONTROL_RANGE

このマクロを使用して、コントロール ID の連続した範囲を、指定された Windows 通知メッセージの単一のメッセージ ハンドラー関数 ( BN_CLICKED など) にマップします。

構文

ON_CONTROL_RANGE( wNotifyCode, id1, id2, memberFxn )

パラメーター

wNotifyCode
ハンドラーが応答する通知コード。

id1
コントロール ID の連続した範囲の先頭にあるコマンド ID。

id2
制御 ID の連続した範囲の末尾にあるコマンド ID。

memberFxn
コントロールがマップされるメッセージ ハンドラー関数の名前。

解説

ID の範囲は id1 で始まり、 id2で終わります。 ハンドラーは、マップされたコントロールのいずれかから送信される指定された通知に対して呼び出されます。

メッセージ マップ範囲の自動サポートはないため、マクロを自分で配置する必要があります。

コントロール ID の範囲に対するハンドラー関数の実装の詳細については、「メッセージ マップ範囲のハンドラーを参照してください。

要件

ヘッダー: afxmsg_.h

関連項目

ON_COMMAND
テクニカル ノート 6: メッセージ マップ
COleCmdUI クラス
COleServerDoc::OnExecOleCmd
RegisterWindowMessage
ユーザー定義によるハンドラー
CCmdUI クラス