首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 6.0 實現三分割窗口與多視圖架構:CSplitterWnd 靜態分割詳解

     編輯:VC 教學

分割窗口類型對比

本文實現 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    // 創建上下文
);

嵌套分割器關鍵點

  1. 父窗口為外層分割器的窗格(&m_wndSplitter1)
  2. ID 使用 IdFromRowCol(row, col) 獲取窗格 ID
  3. 嵌套分割器需動態創建(new),或作為成員變量
  4. 尺寸計算:外層窗格尺寸 → 內部分割

常見問題與調試

類型特點適用場景
動態分割運行時創建/銷毀視圖,通常單視圖類文本編輯器、多文檔同視圖
靜態分割創建時固定行列,最多 16×16,各窗格可異視圖類資源管理器、郵件客戶端、IDE
問題原因解決
視圖不顯示CreateView 失敗檢查 RUNTIME_CLASS、尺寸、pContext 傳遞
分割條不見風格缺少 WS_VISIBLE確保 CreateStatic dwStyle 包含 WS_VISIBLE
閃爍/重繪異常嵌套分割器父子關係錯誤父窗口必須是外層分割器窗格
無法調整大小未啟用分割條檢查樣式、OnSize 消息處理

擴展:動態分割與視圖切換

  • 動態分割:CSplitterWnd::CreateView 運行時調用,配合 DeleteView
  • 視圖切換:同一窗格 SetRuntimeClass + RecalcLayout
  • 保存/恢復佈局:序列化分割器行列比例

總結

CSplitterWnd 是 MFC 實現多視圖分割的核心類。靜態分割通過 CreateStatic + 多次 CreateView 實現;嵌套分割需注意父窗口層級與 ID 分配。掌握 OnCreateClient 重寫時機、視圖類運行時類傳遞、尺寸計算,即可構建複雜專業級界面佈局。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved