一般に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); } }
コメントをかく