MFC
任意のメッセージを MFC で捕捉する


HomeProgramming TipsMFC Tips[MFC-006]

主要なメッセージは最初から OnXXX と MFC のプロパティに用意されています。
そのため、用意されているものに関しては、そちらを使うべきです。

ハードウェアに絡むような場合や、WIN_APP を使って自分で定義したような場合は、
プロシージャをオーバーライドするよりも、メッセージマップを使って
メッセージに応じた関数を自動的に呼び出すように指定します。

例えば、自分でメッセージを拡張した WM_APP_SYSTEMTRAY を捕捉したいとします。
ヘッダファイルに afx_msg から始まる関数が並んでいるところがありますので、
その後ろ辺りに次のように関数を宣言します。名前は何でも良いですが、
頭に On を付けて単語の区切り毎に大文字にした関数名が通例です。

■ MainFrm.h(例)

    afx_msg LRESULT OnAppSystemTray(WPARAM wParam, LPARAM lParam);



引数は必ず WPARAM wParam, LPARAM lParam です。戻り値も LRESULT です。
この関数をメッセージマップに登録します。
cpp ファイルに BEGIN_MESSAGE_MAP() 〜 END_MESSAGE_MAP() で囲まれた場所があります。
その中に ON_MESSAGE() として、どのウィンドウメッセージを捕まえたら、
どの関数を呼び出すのかを追記します。

■ MainFrm.cpp(例)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_MESSAGE(WM_DISPLAYCHANGE, OnAppSystemTray)
END_MESSAGE_MAP()



最後に関数の本体を追加してメッセージに応じた処理を記述します。

■ MainFrm.cpp(例)

LRESULT CMainFrame::OnAppSystemTray(WPARAM wParam, LPARAM lParam)
{
    // TODO : ここに特定なコードを追加してください。

    return 0;
}


なお、よくある質問として LRESULT に何を返却すればよいのかという疑問があります。
これは、処理するウィンドウメッセージによって異なります。そのメッセージの説明を調べましょう。
メッセージによっては正確な値を返却しなければいけません。
自分で作ったメッセージなどで、返却値が特に不要の場合は 0 を返せばよいです。


 Copyright 2005 VALGUS. All Rights Reserved.