「MFCの基礎 - ユーザ定義メッセージ」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「== 概要 == CWndの派生クラス等でユーザメッセージを定義して使う方法を纏める。<br> 具体的には、SendMessage関数やPostMessage関数を…」) |
編集の要約なし |
||
1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
<code>CWnd</code>クラスや<code>CView</code>クラスの派生クラスにおいて、ユーザ定義メッセージを作成して使用する手順を記載する。<br> | |||
<br> | |||
< | 具体的には、<code>SendMessage</code>関数や<code>PostMessage</code>関数を実行して、ユーザ定義メッセージを呼び出す。<br> | ||
<syntaxhighlight lang="c++"> | |||
</ | <CWndクラスまたはCViewの派生クラスのポインタ>->SendMessage(メッセージ名, WPARAM, LPARAM); | ||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
== ユーザメッセージの定義 == | == ユーザメッセージの定義 == | ||
メッセージ名とメッセージIDを定義するため、stdafx.hファイル等に以下を追記する。<br> | |||
< | <u>ただし、メッセージIDは、ユーザが使用できる範囲<code>WM_APP(0x8000)から0xBFFF</code>を使用すること。</u> | ||
stdafx.h | <syntaxhighlight lang="c++"> | ||
// stdafx.h | |||
#define | #define <メッセージ名> WM_USER + [任意の整数値] | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== 応答関数の追加 == | == 応答関数の追加 == | ||
ユーザ定義のメッセージを処理するメソッドは、<code>CWnd</code>クラスや<code>CView</code>クラスの派生クラスのヘッダファイルに以下のように定義する。<br> | |||
< | 定義する場所は、<code>public</code>属性として、<code>DECLARE_MESSAGE_MAP()</code>マクロ以降に定義する。<br> | ||
<syntaxhighlight lang="c++"> | |||
// CWndまたはCViewの派生クラス.h | |||
public: | |||
</ | afx_msg LRESULT <関数名>(UINT wParam, LONG lParam); | ||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
== メッセージマップに登録 == | == メッセージマップに登録 == | ||
ユーザ定義メッセージを処理する関数とメッセージIDを関連付ける。<br> | |||
< | <code>CWnd</code>クラスや<code>CView</code>クラスの派生クラスのcppファイルにある<code>BEGIN_MESSAGE_MAP</code>マクロから<code>END_MESSAGE_MAP</code>マクロ内に、<br> | ||
以下のように登録する。<br> | |||
<syntaxhighlight lang="c++"> | |||
// CWndまたはCViewの派生クラス.cpp | |||
BEGIN_MESSAGE_MAP | BEGIN_MESSAGE_MAP | ||
// ... | // ... | ||
ON_MESSAGE(メッセージ名, 関数名) | ON_MESSAGE(<メッセージ名>, &<関数名>) | ||
// ... | // ... | ||
END_MESSAGE_MAP | END_MESSAGE_MAP | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== 関数の記述 == | == 関数の記述 == | ||
<code>CWnd</code>クラスや<code>CView</code>クラスの派生クラスのcppファイルに、応答関数を作成する。<br> | |||
< | <syntaxhighlight lang="c++"> | ||
// CWndまたはCViewの派生クラス.cpp | |||
LRESULT クラス名::関数名(UINT wParam, LONG lParam) | LRESULT クラス名::関数名(UINT wParam, LONG lParam) | ||
{ | { | ||
// do something | // do something | ||
return 0; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== サンプルコード == | |||
<syntaxhighlight lang="c++"> | |||
// SampleDlg.h | |||
class CSampleDlg : public CDialogEx | |||
{ | |||
// ... | |||
DECLARE_MESSAGE_MAP() | |||
public: | |||
// ... | |||
// ユーザ定義メッセージを処理する関数を定義する | |||
afx_msg LRESULT OnTest(WPARAM wParam, LPARAM lParam); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// stdafx.h | |||
// メッセージIDを定義する | |||
// メッセージIDはユーザが使用できる範囲 WM_APP(0x8000)~0xBFFFFで定義する | |||
#define WM_MSG_TEST (WM_APP + 1) | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// 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; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:MFC]] | [[カテゴリ:MFC]] |
2021年1月29日 (金) 15:29時点における版
概要
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;
}