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