0

vs2008にMDIMFCFEATUREPACKアプリがあります。

ユーザーが複数のタブグループを作成した場合でも、表示されている子ウィンドウと、最後にアクティブ化された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 に答える