代码之家  ›  专栏  ›  技术社区  ›  Amit G.

CMFCTabCtrl ActiveTab在CMDIQILDWNDEX::OnMdiDe激活和菜单栏问题

  •  0
  • Amit G.  · 技术社区  · 7 年前

    正如标题所建议的,我有一个 CMDIChildWndEx 应用程序(在VS2017上,Windows 10 x64)。上 ChildFrame , CMyView 创建:(a) CMFCTabCtrl (ID=1),2 CView 派生类:比方说(b) CViewDerivedA 对象(id=2)和(c) CViewDerivedB 对象(id=3)。A-C的父项是 视图类 . 视图类 添加 CDerivedViewA 对象作为tab-0,并且 CVIEWDERIVEDB公司 对象为表1。 塞维韦达 处理菜单栏的菜单。但是,当我打开MDI文档时,菜单不会启用,直到切换到选项卡1并返回到选项卡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)到 StFixCube() 在活动选项卡上,当我 SetActiveTab() 下一步。怎样才能把它做好?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Amit G.    7 年前

    我找到了解决办法:

    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);
            }
        }