スポンサーリンク

| キーワード:

MFCのCMainFrame上でCSplitterWndを使い画面分割

CSplitterWndでCMainFrameを画面分割する。構造としては、MFCが作成したシングルドキュメントのウィンドウは、CMainFrameを親とし、その子にツールバー、CChildView、ステータスバーが乗っている。このCChildViewをCSplitterWndで置き換えることで実現する。

1.MFCで単一ドキュメントのプロジェクト作成

ドキュメント/ビューアーキテクチャは無効にしておく。

2.CChildView m_wndView を削除

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();
}

3.CViewを継承したCLeftView,CRightViewを作成

4.CSplitterWnd m_wndSplitter;を定義

protected:  // コントロール バー用メンバー
	CToolBar          m_wndToolBar;
	CStatusBar        m_wndStatusBar;
	// 使用しない CChildView    m_wndView; 
	CSplitterWnd m_wndSplitter;// スプリッターの定義

5.OnCreateClientをオーバーライドしCSplitterWndの設定を追加

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);
}

6.実行例

CLeftView,CRightViewに着色すると結果がわかりやすい

void CLeftView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: 描画コードをここに追加してください。

	CRect rect;
	this->GetClientRect(&rect);
	pDC->FillSolidRect(&rect,RGB(255,0,0));
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: