自分でハンドラーを作成しようとして、メッセージ マップを処理しないでください。ほとんどのメッセージでは、ウィザードがコードを追加します。たとえば、ダイアログのツリー コントロールの場合、リソース エディターでツリー コントロールを選択し、[イベント ハンドラーの追加] を選択できます (クラス ビューとプロパティを使用してメッセージ ハンドラーを挿入する方法は他にもあります)。MS がそれをイベント ハンドラーと名付けたのは残念ですが、実際には、特定の通知コードを制御するための通知メッセージ ハンドラーです。あなたの場合は TVN_BEGINDRAG です。ウィザードは、適切なエントリをメッセージ マップに挿入します。
ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE_DRAG, &CYourDlg::OnTvnBegindragTreeDrag)
.h ファイルに宣言を追加します。
afx_msg void OnTvnBegindragTreeDrag(NMHDR *pNMHDR, LRESULT *pResult);
および .cpp ファイルの実装 (定義):
void CYourDlg::OnTvnBegindragTreeDrag(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
}
簡単に言うと、メッセージ マップは、メッセージ ハンドラーを柔軟に挿入できるように MFC が設計された方法です。Win32 アプリケーションと同様に、メッセージ ハンドラは Windows プロシージャから呼び出されます。MFC では、すべてのコントロールがサブクラス化されるのは MFC ウィンドウ プロシージャです。メッセージ マップは、AFX_MSGMAP_ENTRY 構造体の静的配列です。
struct AFX_MSGMAP_ENTRY
{
UINT nMessage; // windows message
UINT nCode; // control code or WM_NOTIFY code
UINT nID; // control ID (or 0 for windows messages)
UINT nLastID; // used for entries specifying a range of control id's
UINT_PTR nSig; // signature type (action) or pointer to message #
AFX_PMSG pfn; // routine to call (or special value)
};
MFC ウィンドウ プロシージャはこのマップを取得し、特定の署名 (nSig) のエントリを検索し、エントリの署名が一致する場合は、適切な関数 (pfn) を呼び出します。マップ内の各メッセージ エントリは、この構造に展開される特定のマクロを使用します。メッセージがMW_NOTIFYであるため、あなたの場合はON_NOTIFYです。通知コード TVN_BEGINDRAG も表示されます。ウィザード データベースにないメッセージまたはカスタム メッセージのメッセージ エントリを作成する場合は、次の方法で使用できる ON_MESSAGE という選択肢がいくつかあります。ヘッダーと cpp ファイルに。
ON_MESSAGE(WM_CUSTOM_MESSAGE, OnCustomMessage)
LRESULT CTreeCtrlDragSampleDlg::OnCustomMessage(WPARAM wParam, LPARAM lParam)
{
return 0;
}
afx_msg LRESULT OnCustomMessage(WPARAM wParam, LPARAM lParam);
その他の選択肢: ウィンドウまたはウィンドウ コモン コントロールからの WM_COMMAND メッセージをマップする ON_COMMAND、ON_CONTROL。より詳しい情報:
http://msdn.microsoft.com/en-us/library/6d1asasd(v=vs.100).aspx for VS 2010