Last Updated 2014/08/20
Programming Tips Visual C++ MFC 他のコントロール  索 引 
スプリッターウィンドウで3ペイン
2014/06/29

MFC のアプリケーションウィザードでエクスプローラースタイルの左右に分割されたアプリケーションは作成可能。
では,メーラーなどでよくある3ペインのウィンドウを作成してみよう。



エクスプローラースタイルでは以下の様にコーディングされている。

MainFrm.cpp
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/,
	CCreateContext* pContext)
{
	// 分割ウィンドウを作成します
	if (!m_wndSplitter.CreateStatic(this, 1, 2))
		return FALSE;

	if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext) ||
		!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMainView), CSize(100, 100), pContext))
	{
		m_wndSplitter.DestroyWindow();
		return FALSE;
	}

	return TRUE;
}

それを次の様にする。

まずは View の作成。
クラスウィザードなどで View を追加する。
3分割するにはスプリッターがもう1つ必要になるので,追加する。

MainFrm.h
protected:
	CSplitterWnd m_wndSplitter;
	CSplitterWnd m_wnd2Splitter;    // これを追加


追加した View のヘッダをインクルードして実装する。
MainFrm.cpp
// 追加した View のインクルード
#include "TopView.h"

BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/,
	CCreateContext* pContext)
{
	// 分割ウィンドウを作成します
	if (!m_wndSplitter.CreateStatic(this, 1, 2))
		return FALSE;

	// スプリッターで再度分割
	if (!m_wnd2Splitter.CreateStatic(&m_wndSplitter, 2, 1
			, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 1)))
		return FALSE;

	if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext) ||
		// 再分割した側に View を作成
		!m_wnd2Splitter.CreateView(0, 0, RUNTIME_CLASS(CTopView), CSize(100, 100), pContext) ||
		!m_wnd2Splitter.CreateView(1, 0, RUNTIME_CLASS(CMainView), CSize(100, 100), pContext))
	{
		m_wndSplitter.DestroyWindow();
		m_wnd2Splitter.DestroyWindow();
		return FALSE;
	}

	return TRUE;
}

詳しい説明は省きますが,1行2列に分割して,片方の列を2行1列に分割する方法です。
スプリッターが1つの場合,2行2列の4つのビューとか1行4列の4つのビューとかの単純分割しか出来ません。
複雑な分割はその都度スプリッターが必要になります。


参照
ウィンドウ分割
ウィンドウ分割固定化
スプリッターウィンドウの追加
前後のTips
スプリッターウィンドウで3ペイン

DSS ProgrammingTipsCGI Ver2.01