メッセージ マップ マクロ (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
またはprivate
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
コマンドがマップされるメッセージ ハンドラー関数の名前。
解説
メニュー項目やツール バー ボタンなどのコマンド ユーザー インターフェイス オブジェクトからのコマンド メッセージを処理する関数を示します。
コマンド ターゲット オブジェクトが、指定した 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
クラス