使用处理程序OnBegindrag与CTreeCtrl

时间:2012-05-26 19:44:16

标签: c++ mfc event-handling drag-and-drop

我有MyCTreeCtrl类,我想添加消息处理程序,如:

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

}

我应该写什么:

BEGIN_MESSAGE_MAP(MyCTreeCtrl, CTreeCtrl)

END_MESSAGE_MAP()

用于创建BEGINDRAG处理程序。

你不能告诉我一些关于MFC中消息处理的文献吗?感谢。

1 个答案:

答案 0 :(得分:1)

您不应该处理尝试自己创建处理程序的消息映射。对于大多数消息,向导将为您添加代码。 例如,对于对话框中的树控件,您可以在资源编辑器中选择树控件,然后选择Add Event Handler(还有其他使用类视图和属性插入消息处理程序的方法)。不幸的是,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消息。 更多信息:

VS 2010的

http://msdn.microsoft.com/en-us/library/6d1asasd(v=vs.100).aspx