0

我在 vs2008 中有一个 MDI MFC FEATURE PACK 应用程序。

我确实需要确定哪些子窗口是可见的,即使用户创建了多个选项卡组,以及最后激活的 MDI 子窗口是什么。我发现在我的大型机CMDIFrameWndEx类中,方法

m_wndClientArea.FindActiveTabWnd ();
m_wndClientArea.GetFirstTabWnd ();
m_wndClientArea.GetNextTabWnd (); 

这可能让我浏览所有选项卡组。麻烦的是这些方法返回一个CMFCTabControl不提供任何方法/成员来获取指向选项卡中 MDI 子窗口的指针。它只给出活动选项卡的索引。那么如何获取CMDIChildWndEx*给定选项卡组的“前面”窗口的指针呢?

4

2 回答 2

1

因为您的 CMDIChildWndEx 实例被包装在选项卡控件包装器中,所以您可以获取活动选项卡,然后从中获取 wnd,例如

int nActive = pTabCtrl->GetActiveTab();
CWnd * pWnd = pTabCtrl->GetTabWndNoWrapper( nActive );

CMDIChildWndEx * pChild = dynamic_cast<CMDIChildWndEx*>(pWnd);
于 2011-03-09T16:22:34.880 回答
1

找到这段代码真是太好了——正是我需要在每个选项卡组中重绘我的活动选项卡窗口,因为有多个(拆分)选项卡组,它们没有被正确地重绘。但是,要使循环工作,我必须执行以下操作(CChildFrame 是我的派生帧类型):

m_arrpActiveChilds.RemoveAll (); 
const CObList& TabGroups =m_wndClientArea.GetMDITabGroups(); 
if (TabGroups.GetCount ()>0) { 
    POSITION crtPos = TabGroups.GetHeadPosition (); 
    CMFCTabCtrl* pCrtTabCtrl;

    do { 
        pCrtTabCtrl=DYNAMIC_DOWNCAST(CMFCTabCtrl, TabGroups.GetNext(crtPos)); 
        int nActive = pCrtTabCtrl->GetActiveTab(); 
        CWnd * pWnd = pCrtTabCtrl->GetTabWndNoWrapper( nActive ); 
        CChildFrame * pChild = dynamic_cast<CChildFrame*>(pWnd); 
        m_arrpActiveChilds.Add (pChild);
    } while(crtPos != NULL);
于 2011-07-02T04:20:47.287 回答