2012-05-26 31 views
0

我有類MyCTreeCtrl我要添加消息處理程序,如:使用處理器OnBegindrag與CTreeCtrl的

void MyCTreeCtrl::OnBegindrag(NMHDR *pNMHDR, LRESULT *pResult) 
{ 

} 

我應該寫之間什麼:

BEGIN_MESSAGE_MAP(MyCTreeCtrl, CTreeCtrl) 

END_MESSAGE_MAP() 

創建BEGINDRAG處理程序。

難道你不建議我一些有關MFC中的消息處理的文獻?謝謝。

回答

1

你不應該處理試圖自己創建處理程序的消息映射。對於大多數消息,嚮導將爲您添加代碼。 例如,對於對話框中的樹控件,您可以在資源編輯器中選擇樹控件並選擇添加事件處理程序(還有其他使用類視圖和屬性插入消息處理程序的方法)。令人遺憾的是,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

+0

JohnCz,我不使用的資源是這個項目。有3棵相等的樹,並且不需要資源。 – Diego666