MFCの基礎 - ユーザ定義メッセージ
ナビゲーションに移動
検索に移動
概要
CWnd
クラスやCView
クラスの派生クラスにおいて、ユーザ定義メッセージを作成して使用する手順を記載する。
具体的には、SendMessage
関数やPostMessage
関数を実行して、ユーザ定義メッセージを呼び出す。
<CWndクラスまたはCViewの派生クラスのポインタ>->SendMessage(メッセージ名, WPARAM, LPARAM);
ユーザメッセージの定義
メッセージ名とメッセージIDを定義するため、stdafx.hファイル等に以下を追記する。
ただし、メッセージIDは、ユーザが使用できる範囲WM_APP(0x8000)から0xBFFF
を使用すること。
// stdafx.h
#define <メッセージ名> WM_USER + [任意の整数値]
応答関数の追加
ユーザ定義のメッセージを処理するメソッドは、CWnd
クラスやCView
クラスの派生クラスのヘッダファイルに以下のように定義する。
定義する場所は、public
属性として、DECLARE_MESSAGE_MAP()
マクロ以降に定義する。
// CWndまたはCViewの派生クラス.h
public:
afx_msg LRESULT <関数名>(UINT wParam, LONG lParam);
メッセージマップに登録
ユーザ定義メッセージを処理する関数とメッセージIDを関連付ける。
CWnd
クラスやCView
クラスの派生クラスのcppファイルにあるBEGIN_MESSAGE_MAP
マクロからEND_MESSAGE_MAP
マクロ内に、
以下のように登録する。
// CWndまたはCViewの派生クラス.cpp
BEGIN_MESSAGE_MAP
// ...
ON_MESSAGE(<メッセージ名>, &<関数名>)
// ...
END_MESSAGE_MAP
関数の記述
CWnd
クラスやCView
クラスの派生クラスのcppファイルに、応答関数を作成する。
// CWndまたはCViewの派生クラス.cpp
LRESULT クラス名::関数名(UINT wParam, LONG lParam)
{
// do something
return 0;
}
サンプルコード
// SampleDlg.h
class CSampleDlg : public CDialogEx
{
// ...
DECLARE_MESSAGE_MAP()
public:
// ...
// ユーザ定義メッセージを処理する関数を定義する
afx_msg LRESULT OnTest(WPARAM wParam, LPARAM lParam);
}
// stdafx.h
// メッセージIDを定義する
// メッセージIDはユーザが使用できる範囲 WM_APP(0x8000)~0xBFFFFで定義する
#define WM_MSG_TEST (WM_APP + 1)
// SampleDlg.cpp
BEGIN_MESSAGE_MAP(CSampleDlg, CDialogEx)
// ...
// ユーザ定義メッセージを処理する関数とメッセージIDを関連付ける
ON_MESSAGE(WM_MSG_TEST, &CSampleDlg::OnTest)
END_MESSAGE_MAP()
void CSampleDlg::SampleFunc()
{
// ユーザ定義メッセージを送信する
this->PostMessage(WM_MSG_TEST, 0, 0);
// this->SendMessage(WM_MSG_TEST, 0, 0);
}
// ユーザ定義メッセージを処理する関数を実装する
LRESULT CSampleDlg::OnTest(WPARAM wParam, LPARAM lParam)
{
::AfxMessageBox(_T("ユーザ定義メッセージの動作試験"));
return 0;
}