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

sub*_*t_x 4 windows mfc visual-c++

假设我的主类有一个私有成员,它是一个派生自CTreeView控件的类.如何在主类本身处理来自此树视图控件的消息?

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

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

void CViewTree::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
    GetParent()->SendMessage(WM_NOTIFY, 0, (LPARAM)pNMHDR);
}
Run Code Online (Sandbox Code Playgroud)

此代码抛出异常,但如果这确实有效,我将如何处理父类中的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;
}
Run Code Online (Sandbox Code Playgroud)

第二次尝试:

//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");
}
Run Code Online (Sandbox Code Playgroud)

She*_* 蒋晟 7

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

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

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

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