CMDIChildWndEx :: OnMDIActivate上的CMFCTabCtrl ActiveTab和MenuBar问题

时间:2018-06-19 19:00:04

标签: c++ visual-studio mfc

按照标题的建议,我有一个CMDIChildWndEx应用程序(在VS2017,Windows 10 x64上)。在ChildFrame上,CMyView创建:(A)CMFCTabCtrl(Id = 1),2个CView派生类:可以说(B)CViewDerivedA对象( Id = 2)和(C)CViewDerivedB对象(Id = 3)。 A-C的父级是CMyView的父级。 CMyViewCDerivedViewA对象添加为tab-0,并将CViewDerivedB对象添加为tab-1。 CViewDerivedA处理菜单栏的MenuA。但是,当我打开MDI文档时,直到我切换到Tab-1并回到Tab-0之前,菜单才启用。我尝试以下代码,但是SetFocus()不起作用:

// An application sends the WM_MDIACTIVATE message to a multiple-document interface (MDI)
// client window to instruct the client window to activate a different MDI child window.
void CMyChildFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd)
{
    CMDIChildWndEx::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);

    if (bActivate)
    {
        CMFCTabCtrl *pTabCtrl = (CMFCTabCtrl*) GetDlgItem(1);

        if (pTabCtrl->GetActiveTab() == 0) // 0 - Silhouette tab, 1 - Hit List tab
        {
//          CWnd * pWnd = GetDlgItem(2);
//          pWnd->SetFocus();

            pTabCtrl->SetActiveTab(1);
            pTabCtrl->SetActiveTab(0);
        }
    }
}

在任何情况下,在我看来,此解决方案都不是“干净的”,“解决方法”。 >>>>我假设正确的方法是在活动选项卡上将pTabCtrl(Id = 1)告知SetFocus(),就像我SetActiveTab()下一步和返回时一样。正确制作的方法是什么?

1 个答案:

答案 0 :(得分:0)

我找到了解决方法:

void CMyChildFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd)
    {
        CMDIChildWndEx::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);

        if (bActivate)
        {
            CView * pView = (CView*)((CMFCTabCtrl*)GetDlgItem(1))->GetActiveWnd();
            SetActiveView(pView);
        }
    }