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

將子視窗附屬於主視窗:C++Builder 實現 MDI 風格的單視窗多內容切換

     編輯:VC 教學

需求

主視窗客戶區動態顯示不同功能頁面 (表單/圖表),子視窗隨主視窗縮放填滿客戶區,使用者感知不到子視窗存在。

核心原理:Windows 父子視窗關係

VCL 不直接支援「視窗作父視窗」,但 Windows API 允許任何 `HWND` 為另一 `HWND` 父視窗 (`SetParent`)。子視窗設 `WS_CHILD`、`WS_VISIBLE`,無標題列、無邊框。

實現步驟

  1. 建立主視窗 (`TMainForm`),頂部工具列、底部狀態列。
  2. 建立子視窗 (`TTableForm`, `TChartForm`),設計介面、寫業務邏輯,`BorderStyle=bsNone`。
  3. 主視窗切換時:
    
       // 隱藏/銷毀舊子視窗
       if (ActiveChild) ActiveChild->Hide(); // 或 Free
    
       // 建立/顯示新子視窗
       NewChild = new TTableForm(this); // Owner 為主視窗
       SetParent(NewChild->Handle, Handle); // 關鍵:設為主視窗子視窗
       SetWindowLong(NewChild->Handle, GWL_STYLE,
           GetWindowLong(NewChild->Handle, GWL_STYLE) | WS_CHILD | WS_VISIBLE);
       NewChild->Align = alClient; // 填滿客戶區
       NewChild->Show();
       ActiveChild = NewChild;
       
  4. 主視窗 `OnResize` 時,子視窗因 `alClient` 自動調整。

優勢

  • 設計時完整保留子視窗設計器支援 (拖放元件、事件綁定)。
  • 程式碼邏輯集中在子視窗單元,符合封裝原則。
  • 比 `TPageControl`/`TFrame` 更靈活:子視窗可為獨立單元,支援複雜業務邏輯。

注意

子視窗 `OnClose` 需設 `Action = caHide` (隱藏) 或 `caFree` (銷毀),避免主視窗關閉時殘留。

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