CSplitterWndでCMainFrameを画面分割する。構造としては、MFCが作成したシングルドキュメントのウィンドウは、CMainFrameを親とし、その子にツールバー、CChildView、ステータスバーが乗っている。このCChildViewをCSplitterWndで置き換えることで実現する。
ドキュメント/ビューアーキテクチャは無効にしておく。
CChildViewのオブジェクトをCSplitterWndのオブジェクトで置き換えるため、コード上のm_wndViewという変数がかかわるコードをすべて無効化する。m_wndViewの定義をコメントアウトする、あるいは検索すれば簡単に見つかる。
// MainFrm.h : CMainFrame クラスのインターフェイス // #pragma once #include "ChildView.h" class CMainFrame : public CFrameWnd { public: CMainFrame() noexcept; protected: DECLARE_DYNAMIC(CMainFrame) /* 略 */ protected: // コントロール バー用メンバー CToolBar m_wndToolBar; CStatusBar m_wndStatusBar; // 使用しない CChildView m_wndView; /* 略 */ };
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; //// フレームのクライアント領域全体を占めるビューを作成します。 //if (!m_wndView.Create(nullptr, nullptr, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, nullptr)) //{ // TRACE0("ビュー ウィンドウを作成できませんでした。\n"); // return -1; //} /* 略 */ return 0; }
void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/) { // ビュー ウィンドウにフォーカスを与えます。 //m_wndView.SetFocus(); }
protected: // コントロール バー用メンバー CToolBar m_wndToolBar; CStatusBar m_wndStatusBar; // 使用しない CChildView m_wndView; CSplitterWnd m_wndSplitter;// スプリッターの定義
CMainFrameでOnCreateClientをオーバーライドする。
OnCreateClientにはスプリッタの初期設定を記述する。
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: ここに特定なコードを追加するか、もしくは基底クラスを呼び出してください。 // スプリッタウィンドウの作成 m_wndSplitter.CreateStatic(this, 1, 2); // ペインの作成(例:左側にCLeftView、右側にCRightViewを配置) m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(200, 100), pContext); m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(100, 100), pContext); return CFrameWnd::OnCreateClient(lpcs, pContext); }
CLeftView,CRightViewに着色すると結果がわかりやすい
void CLeftView::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); // TODO: 描画コードをここに追加してください。 CRect rect; this->GetClientRect(&rect); pDC->FillSolidRect(&rect,RGB(255,0,0)); }