加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-13 22:33:31 所属栏目:Windows 来源:网络整理
导读:假设我的主类有一个私有成员,它是一个派生自CTreeView控件的类.如何在主类本身处理来自此树视图控件的消息? 这类似于Visual Studios为您构建的MDI基础应用程序,其中有两个可停靠的树视图控件,名为CClassView和CFileView,每个控件都有一个派生自CTreeView的
假设我的主类有一个私有成员,它是一个派生自CTreeView控件的类.如何在主类本身处理来自此树视图控件的消息?

这类似于Visual Studios为您构建的MDI基础应用程序,其中有两个可停靠的树视图控件,名为CClassView和CFileView,每个控件都有一个派生自CTreeView的私有成员.

我可以将消息从子成员控件CViewTree传递给我的CFileView类吗?

void CViewTree::OnTvnSelchanged(NMHDR *pNMHDR,LRESULT *pResult)
{
    GetParent()->SendMessage(WM_NOTIFY,(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");
}

解决方法

不确定为什么要这样做,因为视图和父视图之间存在紧密耦合,所以代码重用性较低.如果要重用选择逻辑,可以将其提取到与 DRAWCLI sample类似的单独类中.

TVN_SELCHANGED已发送给父母.但是,当孩子中存在ON_NOTIFY_REFLECT时,MFC的message reflection将通知路由到子窗口的消息映射.

如果您希望父级在消息处理中也有发言权,则可以将ON_NOTIFY_REFLECT更改为ON_NOTIFY_REFLECT_EX并在反射的消息处理程序中返回FALSE.

您将在父级获得WM_NOTIFY,因此您处理通知的方式是将a ON_NOTIFY macro添加到树视图的父级,就像通常对对话框中的树控件一样.如果您没有指定,则视图的ID可能是AFX_IDW_PANE_FIRST.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读