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

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

Message-Map宣言マクロとデマーケーション マクロ

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

Message-Mappingマクロ

名前 説明
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 指定したユーザー インターフェイス更新コマンド メッセージを処理する関数を示します。

Message-Map範囲マクロ

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

メッセージ マップ、メッセージ マップ宣言とデマーケーション マクロ、およびメッセージ マッピング マクロの詳細については、「Message マップ」および「メッセージ処理とマッピングに関するトピック」を参照してください。 メッセージ マップ範囲の詳細については、「 Handlers for Message-Map Ranges」を参照してください

BEGIN_MESSAGE_MAP

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

構文

BEGIN_MESSAGE_MAP( theClass, baseClass )

パラメーター

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

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

注釈

クラスのメンバー関数を定義する実装 (.cpp) BEGIN_MESSAGE_MAPEND_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 ていますが、このマクロは単一のテンプレート引数を含むクラスを対象にしています。

クラスのメソッド実装 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 します。

注意

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

メッセージ マップとマクロの詳細については、「 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
コマンドがマップされるメッセージ ハンドラー関数の名前。

注釈

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

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

1 ON_COMMAND つのコマンドをメンバー関数にマップするには、 を使用します。 コマンド ON_COMMAND_RANGE の範囲を 1 つのメンバー関数にマップするには、 を使用します。 指定されたコマンド ID と一致できるメッセージ マップ エントリは 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 が処理されたかどうかを示す値である必要があります。それ以外の場合、ルーティングは他のコマンド ターゲット オブジェクトに続きます。

詳細については、「テクニカルノート [テクニカルノート 6: 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 を選択するときは WM_APP 、(0x0400) の範囲内の値を、(0x8000) ~ 0xBFFF の WM_USER 範囲内で使用する必要があります。 メッセージ Id の詳細については、「」を参照して WM_APP ください。

メッセージハンドラー関数にマップする必要があるすべてのユーザー定義メッセージについて、メッセージマップ内に1つ ON_MESSAGE のマクロステートメントを指定する必要があります。

注意

では、ユーザー定義のメッセージに加えて、 ON_MESSAGE あまり一般的でない Windows メッセージを処理します。 詳細については、「 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 のユーザーインターフェイスで開始されたコマンドを受信できるようにし、コンテナーが同じコマンド ([ファイル] メニューの [新規]、[開く]、[保存]、[印刷] など) を送信できるようにします。また、[編集] メニューでは、コピー、貼り付け、元に戻すなどの操作を実行できます。

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

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

ON_OLECMD_CLEARSELECTION( )

Edit Clear コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_CLEARSELECTION, ID_EDIT_CLEAR)

ON_OLECMD_COPY( )

Edit Copy コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_COPY, ID_EDIT_COPY)

ON_OLECMD_CUT( )

Edit Cut コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_CUT, ID_EDIT_CUT)

ON_OLECMD_NEW( )

File New コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_NEW, ID_FILE_NEW)

ON_OLECMD_OPEN( )

File Open コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_OPEN, ID_FILE_OPEN)

ON_OLECMD_PAGESETUP( )

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

ON_OLECMD(NULL, OLECMDID_PAGESETUP, ID_FILE_PAGE_SETUP)

ON_OLECMD_PASTE( )

Edit Paste コマンドをディスパッチします。 次のように実装されます。

ON_OLECMD(NULL, OLECMDID_PASTE, ID_EDIT_PASTE)

ON_OLECMD_PASTESPECIAL( )

Edit Paste Special コマンドをディスパッチします。 次のように実装されます。

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( )

Edit Select All コマンドをディスパッチします。 次のように実装されます。

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 名前。

注釈

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

要件

ヘッダー:afxmsg_.h

ON_THREAD_MESSAGE

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

構文

ON_THREAD_MESSAGE( message, memberFxn )

パラメーター

message
メッセージ ID。

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

注釈

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

要件

ヘッダー:afxole.h

ON_UPDATE_COMMAND_UI

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

構文

ON_UPDATE_COMMAND_UI( messageId, memberFxn )

パラメーター

messageId
メッセージ ID。

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

注釈

メッセージ ハンドラー関数にマップ ON_UPDATE_COMMAND_UI する必要があるすべてのユーザー インターフェイス更新コマンドに対して、メッセージ マップにマクロ ステートメントが 1 つ必要です。

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

要件

ヘッダー: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 の範囲を 1 つのメンバー関数にマップするには、 を使用します。 1 ON_COMMAND つのコマンドをメンバー関数にマップするには、 を使用します。 指定されたコマンド ID と一致できるメッセージ マップ エントリは 1 つのみです。 つまり、コマンドを複数のハンドラーにマップできないのです。 メッセージ範囲のマッピングの詳細については、「 Handlers for Message-Map Ranges」を参照してください

メッセージ マップ範囲は自動的にサポートされません。そのため、マクロを自分で配置する必要があります。

// 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 を単一の更新メッセージ ハンドラー関数に追加します。

構文

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 のハンドラー関数の実装の詳細については、「 Handlers for Message-Map Ranges」を参照してください

要件

ヘッダー:afxmsg_.h

関連項目

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