C ++, пакет функций MFC, видимость дочерних элементов Mdi

У меня есть приложение MDI MFC FEATURE PACK в vs2008.

Мне действительно нужно определить, какие дочерние окна отображаются, даже если пользователем создано несколько групп вкладок, а также то, что является последним активированным дочерним элементом MDI. Я обнаружил, что в моем классе CMDIFrameWndEx мэйнфрейма методы

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

это потенциально могло позволить мне перемещаться по всем группам вкладок. Проблема в том, что эти методы возвращают CMFCTabControl, который не предлагает никакого метода / члена для получения указателя на дочерние окна MDI на вкладке. Он дает только индекс активной вкладки. Итак, как мне получить указатель CMDIChildWndEx* переднего окна данной группы вкладок?


person Pifcnt    schedule 01.03.2011    source источник


Ответы (2)


Поскольку ваши экземпляры CMDIChildWndEx заключены в оболочку элемента управления вкладками, вы можете получить активную вкладку, а затем wnd из нее, например

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

CMDIChildWndEx * pChild = dynamic_cast<CMDIChildWndEx*>(pWnd);
person snowdude    schedule 09.03.2011
comment
Код: 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<CMDIChildWndEx*>(pWnd); m_arrpActiveChilds.Add (pChild); pCrtTabCtrl=DYNAMIC_DOWNCAST(CMFCTabCtrl, TabGroups.GetNext(crtPos)); } while(pCrtTabCtrl!=NULL && crtPos!=NULL); - person Pifcnt; 14.03.2011
comment
Извините, но количество символов в комментариях ограничено, поэтому я не смог заставить код выглядеть очень хорошо. Приведенный выше код является функцией-членом, которую я добавил в свой производный от CMainframeEx класс. Я также добавил участника CArray<CMDIChildWndEx*,CMDIChildWndEx*> m_arrpActiveChilds; - person Pifcnt; 14.03.2011

Было замечательно найти этот код - именно то, что мне нужно, чтобы перерисовать мои активные окна вкладок в каждой группе вкладок, поскольку с несколькими (разделенными) группами вкладок они не перерисовывались правильно. Однако, чтобы цикл заработал, мне пришлось сделать следующее (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);
person Chris    schedule 02.07.2011