メッセージ マップ マクロ (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コントロール通知メッセージです。

メッセージ マップ、メッセージ マップ宣言および区分マクロ、およびメッセージ マッピング マクロの詳細については、「メッセージのマップとメッセージ処理とマッピングのトピック」を参照してください。 メッセージ マップ範囲の詳細については、「メッセージ マップ範囲のハンドラー」を参照してください

BEGIN_MESSAGE_MAP

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

構文

BEGIN_MESSAGE_MAP( theClass, baseClass )

パラメーター

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

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

解説

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

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

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 ファイルで、マクロ、各メッセージ ハンドラー関数のマクロ エントリ、およびマクロをEND_MESSAGE_MAP使用BEGIN_MESSAGE_MAPします。

Note

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

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

class CMainFrame : public CMDIFrameWnd
{
   DECLARE_MESSAGE_MAP()

   // Remainder of class declaration omitted.

必要条件

ヘッダー:afxwin.h

END_MESSAGE_MAP

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

構文

END_MESSAGE_MAP( )

解説

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

必要条件

ヘッダー:afxwin.h

ON_COMMAND

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

構文

ON_COMMAND( commandId, memberFxn )

パラメーター

commandId
コマンド ID。

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

解説

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

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

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

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提供します。 拡張コマンド ハンドラーメンバー関数は、 UINT コマンド ID を含む 1 つのパラメーターを受け取り、 BOOL. 戻り値は、コマンドが処理されたことを示す値にする TRUE 必要があります。それ以外の場合、ルーティングは他のコマンド ターゲット オブジェクトに引き続き適用されます。

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

必要条件

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

ON_CONTROL

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

構文

ON_CONTROL( wNotifyCode, commandId, memberFxn )

パラメーター

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

commandId
コマンド ID。

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

解説

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

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

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

必要条件

ヘッダー:afxmsg_.h

ON_MESSAGE

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

構文

ON_MESSAGE( message, memberFxn )

パラメーター

message
メッセージ ID。

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

関数 afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM)の型は .

解説

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

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

Note

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

詳細と例については、「メッセージ処理とマッピングのトピックユーザー定義ハンドラー」を参照してください

#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
メッセージがマップされるメッセージ ハンドラー関数の名前。

解説

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

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

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マップされる -message-handler 関数の名前。

解説

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

必要条件

ヘッダー:afxmsg_.h

ON_THREAD_MESSAGE

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

構文

ON_THREAD_MESSAGE( message, memberFxn )

パラメーター

message
メッセージ ID。

memberFxn
メッセージが CWinThreadマップされる -message-handler 関数の名前。

解説

ON_THREAD_MESSAGE クラスがある場合ではなく ON_MESSAGE 、使用する CWinThread 必要があります。 ユーザー定義メッセージは、標準の 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 存在する必要があります。

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

必要条件

ヘッダー:afxole.h

ON_COMMAND_RANGE

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

構文

ON_COMMAND_RANGE( id1, id2, memberFxn )

パラメーター

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

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

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

解説

ID の範囲は次で始まり id1 、末尾 id2は .

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

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

// 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 通知メッセージの 1 つのメッセージ ハンドラー関数にマップします。次に例を示 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 クラス