メッセージ マップ マクロ (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
後にメンバーを宣言する場合は、新しいアクセスの種類 (public
、private
、または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_MESSAGE
CWinThread
クラスがある場合は、ON_REGISTERED_MESSAGE
の代わりに使用する必要があります。
要件
ヘッダー: afxmsg_.h
ON_THREAD_MESSAGE
ユーザー定義メッセージを処理する関数を示します。
構文
ON_THREAD_MESSAGE( message, memberFxn )
パラメーター
message
メッセージ ID。
memberFxn
メッセージがマップされる CWinThread
メッセージ ハンドラー関数の名前。
解説
ON_THREAD_MESSAGE
CWinThread
クラスがある場合は、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
クラス