MFCの基礎 - ユーザ定義メッセージ

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

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;
 }