1

(親)内に (子)をCMDIChildWnd含む があります。には、子ビューに送信するツールバーもあります。それはこれまでのところうまくいきます。これで、がアクティブ化される (たとえば、クリックする)たびに、メッセージは 親 ではなく に到着します。CReportViewCFormViewCMDIChildWndON_UPDATE_COMMAND_UICReportViewON_UPDATE_COMMAND_UICReportViewCFormView

私が今やりたいことは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;
}

しかし、それもうまくいきませんでした。誰にもアイデアはありますか?

4

1 に答える 1

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;
}
于 2013-01-11T07:48:23.387 に答える