透過覆寫 CreateParams 將子視窗指定為主視窗的子視窗 (WS_CHILD),並設定位置大小填滿主視窗客戶區 (扣除工具列、狀態列),達到類似分頁切換的效果,但保留設計時期視窗設計器優勢。
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 = 0Position = 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;
}
}
void __fastcall TChartForm::FormClose(TObject *Sender, TCloseAction &Action)
{
MainForm->ActiveChild = 0;
MainForm->Chart1->Checked = false;
Action = caFree;
}