フレームウィンドウにスプリッタウィンドウを作成しそのスプリットされたウィンドウに複数のビューを登録し、それを切り替えて表示する。
基本的な考え方は、“SDIで複数のビューを扱う”と同じ。
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if (!m_wndSplitter1.CreateStatic(this, 1, 2) ||!m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CAView), CSize(128,0), pContext) ||!m_wndSplitter1.CreateView(0, 1, RUNTIME_CLASS(CBView), CSize(0,0), pContext)) { TRACE0("Failed to create split bar "); return FALSE; // 作成に失敗しました。 } if (!m_wndSplitter2.CreateStatic(this, 2, 1, WS_CHILD | WS_VISIBLE, AFX_IDW_PANE_FIRST+1) ||!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CCView), CSize(0,128), pContext) ||!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CDView), CSize(0,0), pContext)) { TRACE0("Failed to create split bar "); return FALSE; // 作成に失敗しました。 } m_wndSplitter2.ShowWindow(SW_HIDE); m_pActiveSPWnd = &m_wndSplitter1; return TRUE; } void CMainFrame::ChangeSPWnd(CSplitterWnd* pNewSPWnd) { int nNewSPWndID = pNewSPWnd->GetDlgCtrlID(); int nNowSPWndID = m_pActiveSPWnd->>GetDlgCtrlID(); pNewSPWnd->SetDlgCtrlID(nWnd2ID); m_pActiveSPWnd->SetDlgCtrlID(nWnd1ID); pNewSPWnd->ShowWindow(SW_SHOW); m_pActiveSPWnd->ShowWindow(SW_HIDE); SetActiveView((CView*)pNewSPWnd->GetPane()); m_pActiveSPWnd = pNewSPWnd; RecalcLayout(); }
ポイントは、AFX_IDW_PANE_FIRST + 1 と 切り替えるとき ID も入れ替えることのよう。