假设我的主类有一个私有(private)成员,它是从 CTreeView 控件派生的类。我如何处理来自主类本身的 TreeView 控件的消息?
这类似于 Visual Studios 为您构建的 MDI 基础应用程序,其中您有两个名为 CClassView 和 CFileView 的可停靠 TreeView 控件,每个控件都有一个从 CTreeView 派生的私有(private)成员。
我可以像这样将消息从子成员控件 CViewTree 传递到我的 CFileView 类吗?
void CViewTree::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
GetParent()->SendMessage(WM_NOTIFY, 0, (LPARAM)pNMHDR);
}
这段代码会抛出一个异常,但如果这确实有效,我将如何处理父类中的 TVN_SELCHANGED 消息?
编辑: 因此,我尝试了以下建议,但都不太顺利。
//First try, in the parent .h file:
afx_msg BOOL OnSelChange(NMHDR *pNMHDR, LRESULT *pResult);
//In the .cpp file:
ON_NOTIFY_REFLECT_EX(TVN_SELCHANGED, OnSelChange)
//and
BOOL ParentClass::OnSelChange(NMHDR *pNMHDR, LRESULT *pResult)
{
AfxMessageBox(L"in handler");
Return TRUE;
}
第二次尝试:
//in the parent .h file:
afx_msg void OnSelChange(NMHDR *pNMHDR, LRESULT *pResult);
//In the .cpp file:
ON_NOTIFY(TVN_SELCHANGED, AFX_IDW_PANE_FIRST, OnSelChange)
//and
void ParentClass::OnSelChange(NMHDR *pNMHDR, LRESULT *pResult)
{
AfxMessageBox(L"in handler");
}
最佳答案
不确定为什么要这样做,因为 View 和父 View 之间的紧密耦合会降低代码的可重用性。如果你想重用选择逻辑,你可以将它提取到一个单独的类中,如 DRAWCLI sample
TVN_SELCHANGED 已经发送给 parent 。但是 MFC 的 message reflection当子窗口中存在 ON_NOTIFY_REFLECT 时,将通知路由到子窗口的消息映射。
如果您希望父级在消息处理中也有发言权,您可以将 ON_NOTIFY_REFLECT 更改为 ON_NOTIFY_REFLECT_EX 并在反射消息处理程序中返回 FALSE。
您将在父级收到 WM_NOTIFY,因此您处理通知的方式是添加 a ON_NOTIFY macro到 TreeView 的父 View ,就像您通常对对话框上的树控件所做的那样。如果您没有指定, View 的 ID 可能是 AFX_IDW_PANE_FIRST。
关于windows - (MFC) 如果控件是私有(private)成员,父类如何接收控件的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497852/