ユーザ定義のメッセージのハンドラを追加するには自力で行わなければならない.
(ClassWizard などは使用できない)
ユーザ定義のメッセージハンドラには ON_MESSAGE マクロを使用する.
テクニカルノート6のメッセージマップあたりが参考になる.
■ヘッダ
#define WM_MYMESSAGE1 (WM_USER + 101)
BEGIN_MESSAGE_MAP(CMyView, CTreeView)
//{{AFX_MSG_MAP(CMyView)
ON_WM_PAINT()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MYMESSAGE1, OnMyMessage1)
END_MESSAGE_MAP()
protected:
//{{AFX_MSG(CMyView)
//}}AFX_MSG
afx_msg long OnMyMessage1(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
■ソース
long CMyView::OnMyMessage1(WPARAM wParam, LPARAM lParam)
{
}
ユーザメッセージは WM_USER にオフセットして使用する.
MFC がユーザメッセージを使用している場合もあるので重ならないようにしなければならない.
ユーザメッセージが重ならないように,システムで独自のメッセージを定義するには,RegisterWindowMessage() を使用する.
static UINT WM_MYMSG = ::RegisterWindowMessage("WM_MYMSG");
BEGIN_MESSAGE_MAP(CXXView, CView)
//{{AFX_MSG_MAP(CXXView)
//}}AFX_MSG_MAP
ON_REGISTERED_MESSAGE(WM_MYMSG, OnMyMsg)
END_MESSAGE_MAP()
RegisterWindowMessage() は同一セッション(ログアウトしない限り)なら同じ値が返ることが保証されている.
アプリケーション間でメッセージやり取りするのも問題はない.
参照
WM_USER の範囲