你不應該處理試圖自己創建處理程序的消息映射。對於大多數消息,嚮導將爲您添加代碼。 例如,對於對話框中的樹控件,您可以在資源編輯器中選擇樹控件並選擇添加事件處理程序(還有其他使用類視圖和屬性插入消息處理程序的方法)。令人遺憾的是,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) 。 地圖中的每個消息條目都使用擴展到此結構的特定宏。 在你的情況下它是ON_NOTIFY,因爲消息是MW_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);
其他選擇:ON_COMMAND,ON_CONTROL映射WM_COMMAND從窗戶或窗戶公共控制消息。 更多信息:
http://msdn.microsoft.com/en-us/library/6d1asasd(v=vs.100).aspx 2010 VS
JohnCz,我不使用的資源是這個項目。有3棵相等的樹,並且不需要資源。 – Diego666