按照标题的建议,我有一个CMDIChildWndEx
应用程序(在VS2017,Windows 10 x64上)。在ChildFrame
上,CMyView
创建:(A)CMFCTabCtrl
(Id = 1),2个CView
派生类:可以说(B)CViewDerivedA
对象( Id = 2)和(C)CViewDerivedB
对象(Id = 3)。 A-C的父级是CMyView
的父级。 CMyView
将CDerivedViewA
对象添加为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()
下一步和返回时一样。正确制作的方法是什么?
答案 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);
}
}