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