Visual c++ C++;,MFC功能包,Mdi儿童可见性

Visual c++ C++;,MFC功能包,Mdi儿童可见性,visual-c++,mfc-feature-pack,mdichild,active-window,Visual C++,Mfc Feature Pack,Mdichild,Active Window,我在vs2008中有一个MDI MFC功能包应用程序 我确实需要确定哪些子窗口是可见的,即使用户创建了多个选项卡组,以及最后激活的MDI子窗口是什么。我发现在我的mainframeCMDIFrameWndEx类中 m_wndClientArea.FindActiveTabWnd (); m_wndClientArea.GetFirstTabWnd (); m_wndClientArea.GetNextTabWnd (); 这可能会让我浏览所有的标签搜索。问题是这些方法返回的CMFCTabCo

我在vs2008中有一个MDI MFC功能包应用程序

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

m_wndClientArea.FindActiveTabWnd ();
m_wndClientArea.GetFirstTabWnd ();
m_wndClientArea.GetNextTabWnd (); 
这可能会让我浏览所有的标签搜索。问题是这些方法返回的
CMFCTabControl
不提供任何方法/成员来获取指向选项卡中MDI子窗口的指针。它只提供活动选项卡的索引。
那么,如何获取给定选项卡组的“前面”窗口的
CMDIChildWndEx*
指针呢?

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

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

CMDIChildWndEx * pChild = dynamic_cast<CMDIChildWndEx*>(pWnd);
int-nActive=pTabCtrl->GetActiveTab();
CWnd*pWnd=pTabCtrl->GetTabWndNoWrapper(nActive);
CMDIChildWndEx*pChild=动态投影(pWnd);

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

m_arrpActiveChilds.RemoveAll();
const CObList&TabGroups=m_wndClientArea.GetMDITabGroups();
如果(TabGroups.GetCount()>0){
POSITION crtPos=TabGroups.GetHeadPosition();
CMFCTabCtrl*pCrtTabCtrl;
做{
pCrtTabCtrl=DYNAMIC_DOWNCAST(CMFCTabCtrl,TabGroups.GetNext(crtPos));
int nActive=pCrtTabCtrl->GetActiveTab();
CWnd*pWnd=pCrtTabCtrl->GetTabWndNoWrapper(nActive);
CChildFrame*pChild=动态投影(pWnd);
m_arrpActiveChilds.Add(pChild);
}while(crtPos!=NULL);

code:
m_arrpActiveChilds.RemoveAll();
const-CObList&TabGroups=m_-wndClientArea.GetMDITabGroups();if(TabGroups.GetCount()>0){CMFCTabCtrl*pCrtTabCtrl=DYNAMIC_DOWNCAST(CMFCTabCtrl,TabGroups.GetHead());POSITION crtPos=TabGroups.GetHeadPosition();do{int-nActive=pCrtTabCtrl->GetActiveTab());CWnd*pWnd=pCrtTabCtrl->GetTabWndNoWrapper(nActive);CMDIChildWndEx*pChild=dynamic_cast(pWnd);m_arrpActiveChilds.Add(pChild);pCrtTabCtrl=dynamic_DOWNCAST(CMFCTabCtrl,TabGroups.GetNext(crtPos));}而(pCrtTabCtrl!=NULL&&crtPos!=NULL)很抱歉,注释的字符数有限,因此我无法使代码看起来很好。上面的代码是我添加到
CMainframeEx
派生类中的成员函数。我还添加了一个成员
CArray m_arrpActiveChilds;
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);