「MFCの基礎 - ユーザ定義メッセージ」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == CWndの派生クラス等でユーザメッセージを定義して使う方法を纏める。<br> 具体的には、SendMessage関数やPostMessage関数を…」)
 
編集の要約なし
1行目: 1行目:
== 概要 ==
== 概要 ==
CWndの派生クラス等でユーザメッセージを定義して使う方法を纏める。<br>
<code>CWnd</code>クラスや<code>CView</code>クラスの派生クラスにおいて、ユーザ定義メッセージを作成して使用する手順を記載する。<br>
具体的には、SendMessage関数やPostMessage関数を用いて、ユーザメッセージを下記のように呼び出す。<br>
<br>
  <source lang="c++">
具体的には、<code>SendMessage</code>関数や<code>PostMessage</code>関数を実行して、ユーザ定義メッセージを呼び出す。<br>
  [CWndの派生クラスへのポインタ]->SendMessage(メッセージ名, WPARAM, LPARAM);
  <syntaxhighlight lang="c++">
  </source>
  <CWndクラスまたはCViewの派生クラスのポインタ>->SendMessage(メッセージ名, WPARAM, LPARAM);
  </syntaxhighlight>
<br><br>
<br><br>


== ユーザメッセージの定義 ==
== ユーザメッセージの定義 ==
メッセージのIDを定義するため、"stdafx.h"ファイル等に以下を追加する。<br>
メッセージ名とメッセージIDを定義するため、stdafx.hファイル等に以下を追記する。<br>
  <source lang="c++">
<u>ただし、メッセージIDは、ユーザが使用できる範囲<code>WM_APP(0x8000)から0xBFFF</code>を使用すること。</u>
  stdafx.h
  <syntaxhighlight lang="c++">
  // stdafx.h
   
   
  #define  [メッセージ名]   WM_USER + [任意の整数値]
  #define  <メッセージ名>   WM_USER + [任意の整数値]
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== 応答関数の追加 ==
== 応答関数の追加 ==
CWndの派生クラスのヘッダファイルに存在する"DECLARE_MESSAGE_MAP"マクロ内に、public属性で以下の関数を追加する。<br>
ユーザ定義のメッセージを処理するメソッドは、<code>CWnd</code>クラスや<code>CView</code>クラスの派生クラスのヘッダファイルに以下のように定義する。<br>
  <source lang="c++">
定義する場所は、<code>public</code>属性として、<code>DECLARE_MESSAGE_MAP()</code>マクロ以降に定義する。<br>
  CWndの派生クラス.h
  <syntaxhighlight lang="c++">
   
  // CWndまたはCViewの派生クラス.h
afx_msg  LRESULT  [関数名](UINT wParam, LONG lParam);
  public:
  </source>
    afx_msg  LRESULT  <関数名>(UINT wParam, LONG lParam);
  </syntaxhighlight>
<br><br>
<br><br>


== メッセージマップに登録 ==
== メッセージマップに登録 ==
CWndの派生クラスのcppファイルに存在する"BEGIN_MESSAGE_MAP"マクロ ~ "END_MESSAGE_MAP"マクロの間に、メッセージと関数の関係を以下のように登録する。<br>
ユーザ定義メッセージを処理する関数とメッセージIDを関連付ける。<br>
  <source lang="c++">
<code>CWnd</code>クラスや<code>CView</code>クラスの派生クラスのcppファイルにある<code>BEGIN_MESSAGE_MAP</code>マクロから<code>END_MESSAGE_MAP</code>マクロ内に、<br>
  CWndの派生クラス.cpp
以下のように登録する。<br>
  <syntaxhighlight lang="c++">
  // CWndまたはCViewの派生クラス.cpp
   
   
  BEGIN_MESSAGE_MAP
  BEGIN_MESSAGE_MAP
  // ...
  // ...
  ON_MESSAGE(メッセージ名, 関数名)
  ON_MESSAGE(<メッセージ名>, &<関数名>)
  // ...
  // ...
  END_MESSAGE_MAP
  END_MESSAGE_MAP
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== 関数の記述 ==
== 関数の記述 ==
CWndの派生クラスのcppファイルに応答関数を以下のように作成する。<br>
<code>CWnd</code>クラスや<code>CView</code>クラスの派生クラスのcppファイルに、応答関数を作成する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  CWndの派生クラス.cpp
  // 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;
  }
  }
  </source>
  </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;
 }