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

C++ Builder 讓從屬視窗寄居於主視窗客戶區

     編輯:關於C++

非 MDI 方式將子視窗嵌入主視窗

透過覆寫 CreateParams 將子視窗指定為主視窗的子視窗 (WS_CHILD),並設定位置大小填滿主視窗客戶區 (扣除工具列、狀態列),達到類似分頁切換的效果,但保留設計時期視窗設計器優勢。

子視窗覆寫 CreateParams

void __fastcall TChartForm::CreateParams(TCreateParams & Params)
{
    TForm::CreateParams(Params);
    Params.Style = WS_CHILD | WS_CLIPSIBLINGS; // 子視窗樣式
    Params.WndParent = MainForm->Handle;       // 父視窗為主視窗
    Params.X = 0;
    Params.Y = MainForm->ToolBar->Height + 1;  // 扣除工具列
    Params.Width = MainForm->ClientRect.Right;
    Params.Height = (MainForm->StatusBar->Top - 1) - Params.Y; // 扣除狀態列

    // 若子視窗大於主視窗客戶區,自動放大主視窗
    if (Width > MainForm->ClientWidth)
        MainForm->ClientWidth = Width;
    if (Height > (MainForm->StatusBar->Top - MainForm->ToolBar->Height))
        MainForm->ClientHeight = Height + MainForm->ToolBar->Height + MainForm->StatusBar->Height;
}

子視窗屬性設定

  • AutoScroll = false, BorderStyle = bsSizeable, BorderWidth = 0
  • Position = poDefault (位置由 CreateParams 決定)
  • 從自動建立清單移除,需時動態建立

主視窗管理子視窗

// 主視窗公有變數
TForm *ActiveChild = 0;

// 切換顯示圖表視窗
void __fastcall TMainForm::Chart1Click(TObject *Sender)
{
    if (ActiveChild) delete ActiveChild; // 刪除舊子視窗
    TChartForm *form = new TChartForm(this);
    ActiveChild = form;
    form->Show();
    Chart1->Checked = true; Table1->Checked = false;
}

// 主視窗 OnResize 調整子視窗大小
void __fastcall TMainForm::FormResize(TObject *Sender)
{
    if (ActiveChild) {
        ActiveChild->Width = ClientRect.Right;
        ActiveChild->Height = (StatusBar->Top - 1) - ActiveChild->Top;
    }
}

子視窗 OnClose 釋放管理

void __fastcall TChartForm::FormClose(TObject *Sender, TCloseAction &Action)
{
    MainForm->ActiveChild = 0;
    MainForm->Chart1->Checked = false;
    Action = caFree;
}

優點

  • 保留視窗設計器設計子視窗介面,程式碼集中在子視窗單元。
  • 避免 MDI 限制,適合單一活動視窗佔滿客戶區的應用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved