MFC下TreeViewControl右键点击通知未触发视图处理函数怎么办?
问题分析与解决
你的代码存在两个核心错误,导致右键点击通知无法触发视图的处理函数:
1. NMHDR结构的hwndFrom字段赋值错误
hwndFrom需要填写发送通知的TreeView控件自身窗口句柄,你错误地使用了主窗口的句柄。MFC的通知消息映射机制会验证该字段的有效性,不匹配的情况下会直接忽略消息。
2. WM_NOTIFY消息的接收目标错误
TreeView的直接父窗口是你的CMainView,通知消息默认由子控件发送给直接父窗口。你将消息发给主框架窗口后,框架不会自动将消息转发给视图,因此视图永远无法接收该消息。
修正后的代码
若代码在视图类内部执行:
CTreeCtrl* pTree = (CTreeCtrl*)GetDlgItem(IDC_TREEVIEW); if (!pTree) return; NMHDR hdr; hdr.hwndFrom = pTree->GetSafeHwnd(); // 改为TreeView自身的句柄 hdr.idFrom = IDC_TREEVIEW; hdr.code = NM_RCLICK; // 发送给视图(TreeView的直接父窗口) SendMessage(WM_NOTIFY, (WPARAM)IDC_TREEVIEW, (LPARAM)&hdr);
若代码在视图外部执行(比如主框架类):
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); if (!pMainFrame) return; CMainView* pView = (CMainView*)pMainFrame->GetActiveView(); if (!pView) return; CTreeCtrl* pTree = (CTreeCtrl*)pView->GetDlgItem(IDC_TREEVIEW); if (!pTree) return; NMHDR hdr; hdr.hwndFrom = pTree->GetSafeHwnd(); hdr.idFrom = IDC_TREEVIEW; hdr.code = NM_RCLICK; // 直接发送给视图 pView->SendMessage(WM_NOTIFY, (WPARAM)IDC_TREEVIEW, (LPARAM)&hdr);
内容的提问来源于stack exchange,提问作者Klickmann
相关产品推荐
相关产品推荐

