【问题标题】:C++, MFC Feature Pack,Mdi childs visibilityC++, MFC Feature Pack,Mdi childs visibility
【发布时间】:2011-07-06 13:02:46
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: visual-c++ mfc-feature-pack mdichild active-window


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 代码:m_arrpActiveChilds.RemoveAll ();const CObList&amp; TabGroups =m_wndClientArea.GetMDITabGroups(); if (TabGroups.GetCount ()&gt;0) { CMFCTabCtrl* pCrtTabCtrl= DYNAMIC_DOWNCAST(CMFCTabCtrl,TabGroups.GetHead () ); POSITION crtPos = TabGroups.GetHeadPosition (); do { int nActive = pCrtTabCtrl-&gt;GetActiveTab(); CWnd * pWnd = pCrtTabCtrl-&gt;GetTabWndNoWrapper( nActive ); CMDIChildWndEx * pChild = dynamic_cast&lt;CMDIChildWndEx*&gt;(pWnd); m_arrpActiveChilds.Add (pChild); pCrtTabCtrl=DYNAMIC_DOWNCAST(CMFCTabCtrl, TabGroups.GetNext(crtPos)); } while(pCrtTabCtrl!=NULL &amp;&amp; crtPos!=NULL);
      • 抱歉,cmets 的字符数有限,所以我无法使代码看起来很好。上面的代码是我添加到我的CMainframeEx 派生类的成员函数。我还加了一个成员CArray&lt;CMDIChildWndEx*,CMDIChildWndEx*&gt; m_arrpActiveChilds;
      猜你喜欢
      • 2011-06-20
      • 2010-09-09
      • 2011-03-20
      • 2011-03-02
      • 2023-04-09
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多