SDIにて複数ビューを使う方法
必要なビューを CMainFrame にメンバとして登録(m_pMainView, m_pSubView など)
OnCreateClient()をオーバーライトする。
さらに、ビュー変更用の関数(ChangeView)を作る。
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { pContext->m_pNewViewClass = RUNTIME_CLASS(CMainView); m_pMainView = (CMainView*)CreateView(pContext, AFX_IDW_PANE_FIRST); pContext->m_pNewViewClass = RUNTIME_CLASS(CSubView); m_pSubView = (CSubView*)CreateView(pContext, AFX_IDW_PANE_FIRST+1); return TRUE; } BOOL CMainFrame::ChangeView(CView* pNewView) { if(!pNewView) return FALSE; CView* pNowView = GetActiveView(); if(!pNowView) return FALSE; //通常考えられないが if(pNowView == pNewView) return FALSE; // Viewの子ウインドウIDの入換え int nNowViewID = pNowView->GetDlgCtrlID(); int nNewViewID = pNewView->GetDlgCtrlID(); pNowView->SetDlgCtrlID(nNewViewID); pNewView->SetDlgCtrlID(nNowViewID); pNowView->ShowWindow(SW_HIDE); //いま表示されていのを消す pNewView->ShowWindow(SW_SHOW); //指定のビューを表示する SetActiveView(pNewView); RecalcLayout(); //フレーム内の位置を再計算 return TRUE; } void CMainFrame::OnChView() // ビュー変更メッセージハンドラ { if (GetActiveView() == m_pMainView) ChangeView(m_pSubView); else ChangeView(m_pMainView); }
(この方法では常に2つのビューはメモリにあるのでちょっと問題か?手っ取り早いが)