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)
不确定为什么要这样做,因为视图和父视图之间存在紧密耦合,所以代码重用性较低.如果要重用选择逻辑,可以将其提取到一个单独的类中,如DRAWCLI示例所做的那样.
TVN_SELCHANGED已发送给父母.但是,当子节点中存在ON_NOTIFY_REFLECT时,MFC的消息反射将通知路由到子窗口的消息映射.
如果您希望父级在消息处理中也有发言权,则可以将ON_NOTIFY_REFLECT更改为ON_NOTIFY_REFLECT_EX并在反射的消息处理程序中返回FALSE.
您将在父级获得WM_NOTIFY,因此处理通知的方式是将ON_NOTIFY宏添加到树视图的父级,就像通常对对话框的树控件一样.如果您没有指定,则视图的ID可能是AFX_IDW_PANE_FIRST.
| 归档时间: |
|
| 查看次数: |
8003 次 |
| 最近记录: |