使用处理程序 OnBegindrag 和 CTreeCtrl
Using handler OnBegindrag with CTreeCtrl
我有类MyCTreeCtrl,我想添加消息处理程序,如下所示:
void MyCTreeCtrl::OnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
}
我应该在以下两者之间写什么:
BEGIN_MESSAGE_MAP(MyCTreeCtrl, CTreeCtrl)
END_MESSAGE_MAP()
用于创建 BEGINDRAG 处理程序。
您不能建议我一些有关 MFC 中消息处理的文献吗?谢谢。
您不应该处理尝试自己创建处理程序的消息映射。对于大多数消息,向导将为您添加代码。例如,对于对话框中的树控件,可以在资源编辑器中选择树控件,然后选择"添加事件处理程序"(还有其他方法可以使用类视图和属性插入消息处理程序)。不幸的是,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 for VS 2010
- MFC:我们如何轻松地从CTreeCtrl切换到CTreeView?
- 将项目插入 CTreeCtrl 时线程函数的奇怪行为
- MFC 如何使 ctreectrl 虚拟
- CTreeCtrl::SortChildren() 是否更改子项的句柄
- 在MFC中的树(ctreectrl)中的特定树项目添加图标
- CTreeCtrl 禁用特定节点上的拖放
- 通过拖放、MFC更改CTreeCtrl项的顺序
- 从存储在 CTreeCtrl 的 LPARAM 中的结构中检索地址/指针 (IXMLDOMNode*) - 不起作用
- 使用处理程序 OnBegindrag 和 CTreeCtrl
- 如何在CTreeCtrl中获取所选项目的文件类型?文件扩展名可能被隐藏,因此 GetItemText 没有帮助
- 再次接收实例 CTreeCtrl 的 ID
- 如何将CTreeCtrl项目滚动到中心
- CTreeCtrl -改变其位置而不移动整个区域
- MFC - CTreeCtrl - SelectItem和SetItemState的区别
- 添加项目到CTreectrl c++
- 如何使CTreeCtrl::展开不改变项目的位置