首页 > 代码库 > 【VC编程技巧】窗体?3.8静态窗口分割

【VC编程技巧】窗体?3.8静态窗口分割

窗口分割在平时编成中用的特别多,Windows的资源管理器,编写代码的IDE(Visual Stdio,Eclipse)都有窗口分割,下面我们以单文档维例开始讲如何进行窗口分割!


CSplitterWnd Class

class CSplitterWnd : public CWnd

CSplitterWnd类很方便的提供了窗口分割的功能,只需下面几步就能完成窗口分割:

  • 定义CSplitterWnd对象在窗口框架类(CFrameWnd或者CMDIChildWnd)中;
  • 重载框架类成员函数CFrameWnd::OnCreateClient();
  • 在重载过的函数CFrameWnd::OnCreateClient()中,通过分割窗口类CSplitterWnd的成员方法CreateStatic,CreateView 实现窗口分割。

分割窗口类的定义:


class CMainFrame : public CFrameWnd
{
	
protected: // シリアル化からのみ作成します。
	CMainFrame();
	DECLARE_DYNCREATE(CMainFrame)

// 属性
public:

// 操作
public:

// オーバーライド
public:
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

// 実装
public:
	virtual ~CMainFrame();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:  // コントロール バー用メンバー
	CToolBar          m_wndToolBar;
	CStatusBar        m_wndStatusBar;
	
	//分割窗口对象定义
	CSplitterWnd      m_wndSplitter1;
	CSplitterWnd      m_wndSplitter2;

// 生成された、メッセージ割り当て関数
protected:
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnApplicationLook(UINT id);
	afx_msg void OnUpdateApplicationLook(CCmdUI* pCmdUI);
	DECLARE_MESSAGE_MAP()

	virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
};

框架类成员函数CFrameWnd::OnCreateClient()重载:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
	// TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
	
	//各View大小的设定
	CSize sizeView1, sizeView2, sizeView3;
	CRect rectClient;
	GetClientRect(&rectClient);
	sizeView1.cx = 200;
	sizeView1.cy = rectClient.Height();
	sizeView2.cx = rectClient.Width() - sizeView1.cx;
	sizeView2.cy = 300;
	sizeView3.cx = sizeView2.cx;
	sizeView3.cy = sizeView1.cy - sizeView2.cy;

	//静态分割窗口
	BOOL bSplitterCreated1 = m_wndSplitter1.CreateStatic(this, 1,2);
	m_wndSplitter1.CreateView(0,0, RUNTIME_CLASS(CStaticSplitWndView), sizeView1, pContext);

	BOOL bSplitterCreated2 = m_wndSplitter2.CreateStatic(&m_wndSplitter1, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,1));
	m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CView2),sizeView2, pContext);
	m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CView3),sizeView3, pContext);

	return bSplitterCreated1 && bSplitterCreated2;
	//return CFrameWnd::OnCreateClient(lpcs, pContext);
}