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つのビューはメモリにあるのでちょっと問題か?手っ取り早いが)