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

MFC 單文檔介面實現視圖上下分割:CSplitterWnd 實戰

     編輯:VC 教學

需求背景

在 SDI (Single Document Interface) 應用程式中,常需將主視圖區域分割為上下兩個獨立視圖,分別顯示不同內容(如:上方列表、下方詳情)。MFC 提供 CSplitterWnd 支援靜態/動態分割,本文示範靜態建立上下兩行、各一列的分割視窗。

核心步驟

  1. 主框架類成員:在 CMainFrame 宣告 CSplitterWnd m_SplitterWnd;。
  2. 重寫 OnCreateClient:此虛函數在文檔/視圖建立前被呼叫,是建立分割視窗的最佳時機。

完整程式碼

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
    // 1. 建立靜態分割視窗:2 行、1 列
    if (!m_SplitterWnd.CreateStatic(this, 2, 1))
        return FALSE;

    // 2. 取得客戶區尺寸,計算上方視圖初始高度
    CRect rect; GetClientRect(&rect);
    int upperHeight = rect.Height() / 2 - 10; // 留 10 像素給分割條

    // 3. 建立上方視圖 (第 0 列、第 0 行)
    if (!m_SplitterWnd.CreateView(0, 0, RUNTIME_CLASS(CTestDownView), CSize(0, upperHeight), pContext))
        return FALSE;

    // 4. 建立下方視圖 (第 1 列、第 0 行),高度 0 表示佔滿剩餘空間
    if (!m_SplitterWnd.CreateView(1, 0, RUNTIME_CLASS(CContainerView), CSize(0, 0), pContext))
        return FALSE;

    return TRUE;
}

關鍵參數說明

參數說明
CreateStatic(this, 2, 1)父視窗、列數、行數。靜態分割建立後不可動態增減面板。
CreateView(row, col, RUNTIME_CLASS(...), size, pContext)指定面板位置、視圖類別 (需 DECLARE_DYNCREATE)、初始大小、建立上下文。
CSize(0, upperHeight)寬度 0 表示自動填滿;高度指定初始像素。
CSize(0, 0)最後一個面板通常傳 (0,0) 佔據所有剩餘空間。

常見問題與技巧

  • 視圖類別必須動態建立:在視圖類別頭文件加 DECLARE_DYNCREATE(CMyView),CPP 加 IMPLEMENT_DYNCREATE(CMyView, CView)。
  • 分割條樣式調整:可在 OnCreateClient 後呼叫 m_SplitterWnd.SetColumnInfo(0, 0, 0) 隱藏垂直分割條 (單列時)。
  • 動態分割:若需運行時拖曳分割條,改用 CreateView 搭配 WS_THICKFRAME 樣式,或直接用 CSplitterWnd::CreateStatic 即可支援拖曳調整比例。
  • 訪問子視圖:CView* pView = (CView*)m_SplitterWnd.GetPane(row, col); 取得指標進行跨視圖通訊。

延伸:三欄式/多層巢狀分割

同理可構建「左右分割 + 右側再上下分割」等複雜佈局:外層 CSplitterWnd 2 列,右側面板再嵌入一個子 CSplitterWnd 2 行。注意巢狀分割時父視窗參數傳遞與 pContext 正確透傳。

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