窗口分割在平时编成中用的特别多,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);
}