我在CMDIChildWnd
(父级)中有一个CReportView
包含CFormView
(孩子)。 CMDIChildWnd
还有一个工具栏,可以将ON_UPDATE_COMMAND_UI
发送到它的子视图。这到目前为止工作。现在,只要CReportView
被激活(例如点击它),ON_UPDATE_COMMAND_UI
邮件就会到达CReportView
,而不是父CFormView
。
我现在要做的是在子视图中捕获ON_UPDATE_COMMAND_UI
消息,并以某种方式将它们转发到父视图。我尝试覆盖CWnd::PreTranslateMessage()
方法并调用父视图的SendMessage()
方法,但ON_UPDATE_COMMAND_UI
没有到达那里。
我也试过以下
BEGIN_MESSAGE_MAP(CUntisSimpleGrid, CReportView)
ON_MESSAGE(WM_IDLEUPDATECMDUI, OnIdleUpdate)
END_MESSAGE_MAP()
LRESULT CUntisSimpleGrid::OnIdleUpdate(WPARAM wParam, LPARAM lParam)
{
CWnd *pParentView = GetParent();
UpdateDialogControls(pParentView, FALSE);
return 0L;
}
但这也不起作用。有没有人有想法?
答案 0 :(得分:1)
我已通过覆盖OnCmdMsg
中的CMDIChildWnd
来解决此问题。现在,在尝试以通常的方式发送消息之后,CMDIChildWnd
也会尝试将消息分派到其非活动视图,并在其中一个消息处理完消息后停止。
BOOL CShowLessonsChildFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
CPushRoutingFrame push(this);
// pump through current view FIRST
CView* pView = GetActiveView();
if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
// then pump through frame
if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
// last but not least, pump through app
CWinApp* pApp = AfxGetApp();
if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
// Now try to dispatch the message to inactive windows and see if
// one of them handles the message
for(UINT id = AFX_IDW_PANE_FIRST; id <= AFX_IDW_PANE_LAST; id++)
{
CWnd *pWnd = GetDescendantWindow(id, TRUE);
if(pWnd && pWnd != GetActiveView()
&& pWnd->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
}
return FALSE;
}