如何使用 CSplitterWnd 分割 SDI & MDI 子視窗窗口 (上2下1)

最近在研究怎麼把視窗分成上二下一,也就是 IDE 常見的視窗格式設計

來紀錄一下怎麼切割 SDI & MDI 子視窗窗口

SDI:

2013-07-02-02

MDI 子視窗:

2013-07-02

 

[實作過程]

1. 在 CMainFrame / CChildFrame 中添加兩個 CSplitterWnd 成員

protected:
	CSplitterWnd *m_pWndSplitter;
	CSplitterWnd *m_pTopWndSplitter;

2. 在 MainFrm.h / ChildFrm.h 中宣告 virtual 函式

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

3. 在 CMainFrame::OnCreateClient()

或 CChildFrame ::OnCreateClient() 函式中實作

將視窗分割成上二(左:ProjectView、右:CCrystalTextView)下一(CStatusView)的功能

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
  m_pWndSplitter = new CSplitterWnd;
  m_pTopWndSplitter = new CSplitterWnd;

  //Create static splitter windows 
  m_pWndSplitter->CreateStatic(this, 2, 1);
  m_pTopWndSplitter->CreateStatic(m_pWndSplitter, 1, 2,
  WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, m_pWndSplitter->IdFromRowCol(0,0) );

  //Creates the panes for a static splitter window.
  m_pTopWndSplitter->CreateView(0, 0, RUNTIME_CLASS(CProjectView), CSize(0,0), NULL);
  m_pTopWndSplitter->CreateView(0, 1, RUNTIME_CLASS(CCrystalTextView), CSize(0,0), NULL);
  m_pWndSplitter->CreateView(1, 0, RUNTIME_CLASS(CStatusView), CSize(0,0), NULL);

  //Get CMainFrame CView Area and set the window size
  CRect rect;
  GetClientRect(&rect);
  m_pWndSplitter->SetRowInfo(0, rect.Height()*3/4, 10);
  m_pTopWndSplitter->SetColumnInfo(0, rect.Width()/4, 30);
  m_pTopWndSplitter->SetColumnInfo(1, (rect.Width()/4)*3, 30);

  return TRUE;
}

使用 SetRowInfo() 和 SetColumnInfo() 可以設定分割視窗的大小

 

[參考資料]

1. Splitting Child Window in MFC MDI Program

2.【MFC】CSplitterWnd使用。(创建3个分割窗口)

3. 使用CSplitterWnd分割窗口