SDIウインドウをスプリッタで分割


種別:

MFC

解説:

SDIウインドウを静的スプリッタで分割して、別のビューを配置する方法を説明します。
このサンプルでは、クライアント領域を左右2つに分割し、それぞれに別のビューを表示します。
また、ビューの初期サイズは、レジストリに保存して、次回表示したときには前回のサイズを復元するようにします。

コード:

CMainFrameのメンバとして、スプリッタウインドウクラスを追加します。

class CMainFrame : public CFrameWnd
{
...
protected: // コントロール バー用メンバ
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
CSplitterWnd m_wndSplitter; // <- これを追加



ClassViewからCMainFrameを右クリックして「仮装関数の追加」メニューを選択。
OnCreateClient関数をオーバーライドする。


CMainFrmaeに使用する2つのビューのヘッダファイルを追加する

#include "XXXDoc.h" // <- 不要な場合もある
#include "XXXView.h"
#include "YYYView.h"

CMainFrameに作成されたOnCreateClient関数を編集する。
ここで、ついでにスプリッタウインドウの幅をレジストリから読み込んで、前回ウインドウを閉じたときと同じサイズにする。

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// スプリッタウインドウの初期化
if(!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;

// ビューの構築
if(!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CXXXView), CSize(10,10), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CYYYView), CSize(10, 10), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}

// スプリッタの幅を設定
int cx = AfxGetApp()->GetProfileInt("config\\SplitterWidth", "0,0", 300);
m_wndSplitter.SetColumnInfo(0, cx, 10);

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

同じように、DestroyWindow()をオーバーライドして、以下のようにしましょう。
BOOL CMainFrame::DestroyWindow()
{
int cx, tmp;
m_wndSplitter.GetColumnInfo( 0, cx, tmp );
AfxGetApp()->WriteProfileInt( "config\\SplitterWidth", "0,0", cx );

return CFrameWnd::DestroyWindow();
}

これで実行してみましょう。
成功すると、以下のようになります。

無事に分割が出来ました!
[PR]
by isoq | 2004-02-28 16:47 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< CTreeViewのCTree... 大きいのも小さいのも中くらいのも >>