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

VC++ SDI 單一文件介面視窗垂直分割上下兩窗格:OnCreateClient 實作

     編輯:VC 教學

核心虛擬函數:OnCreateClient

CFrameWnd::OnCreateClient 是建立客戶區視圖的關鍵。SDI 應用程式中,覆寫此函數並建立 CSplitterWnd 即可實現分割。

最簡代碼:上下兩窗格靜態分割

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

    // 2. 取得客戶區尺寸計算分割比例
    CRect rect;
    GetClientRect(&rect);
    CSize size = rect.Size();
    int cyTop = size.cy / 2 - 10; // 上方窗格高度

    // 3. 建立上方視圖 (第 0 列)
    if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CTopView), CSize(0, cyTop), pContext))
        return FALSE;

    // 4. 建立下方視圖 (第 1 列),高度 0 表示填滿剩餘
    if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CBottomView), CSize(0, 0), pContext))
        return FALSE;

    return TRUE;
}

MainFrm.h 必備宣告

class CMainFrame : public CFrameWnd {
protected:
    CSplitterWnd m_wndSplitter; // 分割器成員變數
    // ...
    virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
    DECLARE_MESSAGE_MAP()
};

視圖類別準備

  • 使用 ClassWizard 新增 CTopView、CBottomView 衍生自 CView
  • 或從現有 View 類別複製修改
  • 確保 RUNTIME_CLASS 宏可解析 (需 #include "TopView.h" 等)

進階:動態調整初始比例

// 依據具體需求調整
int cyTop = 200; // 固定 200 像素
// 或
int cyTop = size.cy * 2 / 3; // 佔 2/3
// 或載入上次使用者調整的位置 (從註冊表/INI 讀取)

分割條樣式微調


// 在 CreateStatic 後、CreateView 前
m_wndSplitter.SetRowInfo(0, cyTop, 50); // 第 0 列理想高度、最小高度
m_wndSplitter.SetRowInfo(1, 100, 50);   // 第 1 列理想、最小

常見錯誤

錯誤原因解決
編譯錯誤:m_wndSplitter 未宣告MainFrm.h 缺少成員變數加入 CSplitterWnd m_wndSplitter;
執行時 Assert 失敗 / 視圖空白RUNTIME_CLASS 對應類別未正確宣告/實作檢查 View 類別 DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE
分割條無法拖動視窗樣式缺少 WS_THICKFRAME 或分割器樣式問題確認 Frame 樣式、分割器建立參數
雙視圖文檔同步問題同一文檔雙視圖需處理 OnUpdate覆寫 OnUpdate 同步捲軸/選取狀態

水平分割 (左右) 版本


if (!m_wndSplitter.CreateStatic(this, 1, 2)) // 1 行 2 列
    return FALSE;
    
int cxLeft = size.cx / 2 - 10;
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(cxLeft, 0), pContext))
    return FALSE;
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(0, 0), pContext))
    return FALSE;

掌握 OnCreateClient → CreateStatic(2,1) → CreateView(0,0) → CreateView(1,0) 這四步,SDI 視窗分割即刻上手,靈活構建專業多窗格介面。

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