新しいメッセージハンドラを作る

新しいメッセージハンドラを作るには二つの方法がある。ひとつは言わずと知れたくラスウィザードを使う方法、もうひとつは、手動で追加する方法だ。クラスウィザードを使う方法は解説の必要がないので、手動で追加する方法だけ解説する。
たとえばリストボックスでアイテムを選択している状態でカーソルキーを押して選択したアイテムを変更した場合、独自のコードを実行させたいとしよう。
まず、目的の(メッセージを受取りたい)クラス定義の中で以下のように定義する。ヘッダファイルの中だ。
必要なのは青い行で、その中の赤い部分は自分で命名する。
これがメッセージを受取ったときに実行される自前の関数だ。
 

class CFileBDlg : public CDialogBar // CCmdTarget
{
DECLARE_DYNCREATE(CFileBrowsDlg)
 

// アトリビュート
public:
 
// オペレーション
public:
 
protected:
// オーバーライド
 
// インプリメンテーション
protected:
 
afx_msg void OnFolderItemChange(NMHDR* pNMHDR, LRESULT* pResult);
 
DECLARE_MESSAGE_MAP()
 
};
 

次はメッセージのマッピングを作成する。
ソースファイルの中に、以下のような部分がある。
青い部分が追加する部分である。これは、IDC_LIST_FOLDER から、 LVN_ITEMCHANGING というメッセージが来たら、OnFolderItemChange を実行しなさいよ、という意味だ。
 

BEGIN_MESSAGE_MAP(CFileBDlg, CDialogBar)
//{{AFX_MSG_MAP(CFileBDlg)
ON_NOTIFY( NM_CLICK, IDC_LIST_FOLDER, OnClickFolderItem )
ON_NOTIFY( NM_DBLCLK, IDC_LIST_FOLDER, OnWClickFolderItem )

ON_NOTIFY( LVN_ITEMCHANGING, IDC_LIST_FOLDER, OnFolderItemChange )
 
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP(
 

あとは OnFolderItemChange  の本体を記述するだけだ。この関数の宣言は

afx_msg void OnFolderItemChange(NMHDR* pNMHDR, LRESULT* pResult);

で終わっているので、あなたは本体だけを記述すれば良い。
 

//-------------------------------------------------------
// フォルダーリスト内のアイコン選択が変更された -
//-------------------------------------------------------
void CFileBDlg::OnFolderItemChange(NMHDR* pNMHDR, LRESULT* pResult)
{
 // ここに必要なコードを書く。
 *pResult = 0;
}