Last Updated 2014/08/20
Programming Tips Visual C++ MFC 他のコントロール  索 引 
スプリッターウィンドウの追加
2014/08/20

VC(VC6)にて,アプリケーションウィザードでエクスプローラースタイルを選択すればスプリッターウィンドウが自動で生成される。
しかし,その場合,View に CTreeView しか選択出来ない。左のビューは各ビューから選択可能である。
CTreeView を使いたくない場合などは,エクスプローラースタイルを選択しないで,独自にスプリッターウィンドウを追加する。

まずは追加するビュークラスを作成する。


メニュー - 挿入(I) - クラスの新規作成(N)...


ここで好きなビュークラスを派生させる。
続いてメインフレームにスプリッターウィンドウを追加する。
class CMainFrame : public CFrameWnd
{
protected:
    CSplitterWnd m_wndMainSW;

メインフレームに OnCreateClient() をオーバーライドする。


メニュー - 表示(V) - ClassWizard(W)...
クラス名CMainFrame
オブジェクトIDCMainFrame
メッセージOnCreateClient

MainFrm.cpp に以下が追加される。

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください

	return CFrameWnd::OnCreateClient(lpcs, pContext);
}


MainFrm.cpp に以下を追加する。

class CTestDoc;
#include  "Test1View.h"
#include  "Test2View.h"

class CTestDoc はビューの GetDocument() でエラーを発生させないように,不完全宣言をしておく。
(GetDocument()でドキュメントのポインタを返すから)

そして,OnCreateClient() を修正する。
(追加するソースはアプリケーションウィザードでエクスプローラースタイルを選択した場合のソースを真似る)
ここでは上下に分けるスプリッターウィンドウを生成する。

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください

	if (!m_wndMainSW.CreateStatic(this, 2, 1))
		return FALSE;

	if (!m_wndMainSW.CreateView(0, 0, RUNTIME_CLASS(CTest1View), CSize(100, 100), pContext) ||
		!m_wndMainSW.CreateView(1, 0, RUNTIME_CLASS(CTest2View), CSize(100, 100), pContext))
	{
		m_wndMainSW.DestroyWindow();
		return FALSE;
	}

	return TRUE;
	//return CFrameWnd::OnCreateClient(lpcs, pContext);
}

デフォルトでは,CFrameWnd::OnCreateClient(lpcs, pContext) の戻り値を返しているが,このままではスプリッターウィンドウは生成されない。
CFrameWnd::OnCreateClient(lpcs, pContext) の中で CreateView() しているのが原因。
それは呼び出さずに,TRUE を返す様に変更する。


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

DSS ProgrammingTipsCGI Ver2.02