| 類型 | 特點 | 適用場景 |
| 動態分割 | 運行時創建/銷毀視圖,通常單視圖類 | 文本編輯器、多文檔同視圖 |
| 靜態分割 | 創建時固定行列,最多 16×16,各窗格可異視圖類 | 資源管理器、郵件客戶端、IDE |
本文實現 SDI 應用三行一列靜態分割,三個窗格分別使用 CListView、CFormView、CEditView。
實現步驟
1. 創建項目與視圖類
- AppWizard 創建 SDI 項目
Test
- 添加三個視圖類:
CInfoView : CListView
CLineView : CFormView(需先創建對話框資源 IDD_FORMVIEW)
CMyEditView : CEditView
2. 主框架類聲明分割器
class CMainFrame : public CFrameWnd {
CSplitterWnd m_wndSplitter1; // 第一層分割
// ...
};
3. 重寫 OnCreateClient
調用時機:OnCreate 之後,視圖創建之前。
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {
CRect rect; GetClientRect(&rect);
// 第一層:2行1列
if (!m_wndSplitter1.CreateStatic(this, 2, 1))
return FALSE;
// 第1行:CInfoView (列表視圖)
if (!m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CInfoView),
CSize(rect.Width(), rect.Height()/2), pContext))
return FALSE;
// 第2行:需要二次分割 → 嵌套分割器
CSplitterWnd* pNested = new CSplitterWnd;
if (!pNested->CreateStatic(&m_wndSplitter1, 1, 2,
WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(1, 0)))
return FALSE;
// 嵌套第1列:CLineView (表單視圖)
if (!pNested->CreateView(0, 0, RUNTIME_CLASS(CLineView),
CSize(rect.Width()/2, rect.Height()/2), pContext))
return FALSE;
// 嵌套第2列:CMyEditView (編輯視圖)
if (!pNested->CreateView(0, 1, RUNTIME_CLASS(CMyEditView),
CSize(rect.Width()/2, rect.Height()/2), pContext))
return FALSE;
return TRUE;
}
關鍵 API 詳解
CSplitterWnd::CreateStatic
BOOL CreateStatic(
CWnd* pParentWnd, // 父窗口
int nRows, // 行數
int nCols, // 列數
DWORD dwStyle = WS_CHILD | WS_VISIBLE,
UINT nID = AFX_IDW_PANE_FIRST
);
CSplitterWnd::CreateView
BOOL CreateView(
int row, int col, // 窗格位置(從0開始)
CRuntimeClass* pViewClass, // 視圖運行時類
SIZE sizeInit, // 初始大小
CCreateContext* pContext // 創建上下文
);
嵌套分割器關鍵點
- 父窗口為外層分割器的窗格(
&m_wndSplitter1)
- ID 使用
IdFromRowCol(row, col) 獲取窗格 ID
- 嵌套分割器需動態創建(
new),或作為成員變量
- 尺寸計算:外層窗格尺寸 → 內部分割
常見問題與調試
| 問題 | 原因 | 解決 |
| 視圖不顯示 | CreateView 失敗 | 檢查 RUNTIME_CLASS、尺寸、pContext 傳遞 |
| 分割條不見 | 風格缺少 WS_VISIBLE | 確保 CreateStatic dwStyle 包含 WS_VISIBLE |
| 閃爍/重繪異常 | 嵌套分割器父子關係錯誤 | 父窗口必須是外層分割器窗格 |
| 無法調整大小 | 未啟用分割條 | 檢查樣式、OnSize 消息處理 |
擴展:動態分割與視圖切換
- 動態分割:
CSplitterWnd::CreateView 運行時調用,配合 DeleteView
- 視圖切換:同一窗格
SetRuntimeClass + RecalcLayout
- 保存/恢復佈局:序列化分割器行列比例
總結
CSplitterWnd 是 MFC 實現多視圖分割的核心類。靜態分割通過 CreateStatic + 多次 CreateView 實現;嵌套分割需注意父窗口層級與 ID 分配。掌握 OnCreateClient 重寫時機、視圖類運行時類傳遞、尺寸計算,即可構建複雜專業級界面佈局。
- 上一篇文章: VC++ 多線程內存操作優化:解決多處理器下的堆爭用瓶頸
- 下一篇文章: VC++繪製任意傾斜橢圓的CWzjEllipse類使用教程
Copyright ©
程式碼之家 All Rights Reserved