windows - (MFC) 如果控件是私有(private)成员,父类如何接收控件的消息?

标签 windows visual-c++ mfc

假设我的主类有一个私有(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/

相关文章:

visual-c++ - VC++ 2010 包含/lib 路径

c++ - 从 C++ 启动独立的可执行文件

c++ - 如何使用SendMessage设置图片框样式

mfc - CMFCListCtrl 强制选择的项目有红色

windows - Windows 批处理脚本起始行中的双引号

python - Python从注册表中读取HKEY CURRENT USER,指定用户

c++ - 如何将应用程序的基本优先级动态设置为 31?

c++ - 在 Windows 中使用两只鼠标执行完全不同的操作

visual-c++ - 更改 mfc 应用程序的标题栏颜色

c++ - CRichEditCtrl 如何知道已执行粘贴操作?