gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:52:16 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com