一般にCSplitterWndに静的にViewを追加するためには RUNTIME_CLASS( classname ) ができなければならない.すなわち,DECLARE_DYNCREATEとIMPLEMENT_DYNCREATEを定義しなければならない.
普通はCFormViewを使うことで可能であるが,すでにCDialogの派生として実装したクラスがある場合,CFormViewで実装しなおすのは徒労である.
そこで既存のCDialog派生クラスを用いる方法として,CFrameWndを間にいれればよい.ただしリソースエディタでウィンドウスタイルの変更は必要.
以下,断片的なコード
普通はCFormViewを使うことで可能であるが,すでにCDialogの派生として実装したクラスがある場合,CFormViewで実装しなおすのは徒労である.
そこで既存のCDialog派生クラスを用いる方法として,CFrameWndを間にいれればよい.ただしリソースエディタでウィンドウスタイルの変更は必要.
以下,断片的なコード
class CLeftFrame : public CFrameWnd;
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
m_wndSplitter.CreateStatic(this, 1, 2);
m_wndSplitter.CreateView( 0, 0, RUNTIME_CLASS ( CLeftFrame ) );
m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS ( CRightFrame ) );
}
int CLeftFrm::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
m_pDlg = new CMyDlg;
m_pDlg->Create(CMyDlg::IDD, this);
m_pDlg->ShowWindow(SW_SHOW);
return 0;
}
//CLeftFrmいっぱいに表示
void CLeftFrm::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
if( m_pDlg != NULL)
{
CRect dlgRect, frmRect;
m_pDlg->GetClientRect( dlgRect );
this->GetClientRect( frmRect );
//大きいほうにあわせる
int width = dlgRect.Width() > frmRect.Width() ? dlgRect.Width() : frmRect.Width();
int height = dlgRect.Height() > frmRect.Height() ? dlgRect.Height() : frmRect.Height();
m_pMenuDlg->MoveWindow(0, 0, width, height);
}
}

コメントをかく