捕获和重定向ON_UPDATE_COMMAND_UI消息



我有一个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;
}

但这也不起作用。有人知道吗?

我通过在CMDIChildWnd中重写OnCmdMsg解决了这个问题。现在,在尝试以通常的方式调度消息之后,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;
}

相关内容

  • 没有找到相关文章

最新更新