視覺化拖放開發雖快速,但控制項位置固定,視窗大小或螢幕解析度改變時版面易亂。需動態調整控制項位置/大小以保持相對佈局。
利用表單 OnResize 事件 (建立、最大化/最小化、拖曳大小均觸發) 計算每個控制項的新 Left/Top/Width/Height。
void __fastcall TForm1::FormResize(TObject *Sender)
{
int mid = Width / 2;
Label1->Left = mid - Label1->Width / 2; // 水平置中
Button1->Left = mid - Button1->Width / 2;
}
TForm::Controls[] 陣列保存表單直接子控制項,ControlCount 為數量。可迴圈統一設定 (如全部置中)。
void __fastcall TForm1::FormResize(TObject *Sender)
{
int mid = Width / 2;
for (int i = 0; i < ControlCount; i++) {
TControl *c = Controls[i];
c->Left = mid - c->Width / 2;
}
}
將相關控制項置於 TPanel 或 TGroupBox 內,調整容器位置/大小即可帶動子控制項。但注意:Controls[] 僅含直接子項,容器內的子控制項需針對容器的 ControlCount/Controls[] 另行處理。
void __fastcall TForm1::FormResize(TObject *Sender)
{
int mid = Width / 2;
for (int i = 0; i < ControlCount; i++) {
TControl *c = Controls[i];
c->Left = mid - c->Width / 2;
if (c == GroupBox1) {
int subMid = GroupBox1->Width / 2;
for (int j = 0; j < GroupBox1->ControlCount; j++) {
TControl *sc = GroupBox1->Controls[j];
sc->Left = subMid - sc->Width / 2;
}
}
}
}
使用 Windows API GetDeviceCaps 取得螢幕水平/垂直解析度 (HORZRES, VERTRES),依比例縮放視窗與控制項。
HDC hdc = GetDC(NULL);
int scrW = GetDeviceCaps(hdc, HORZRES);
int scrH = GetDeviceCaps(hdc, VERTRES);
ReleaseDC(NULL, hdc);
// 依設計時基準解析度 (如 1024x768) 計算縮放比例
double scaleX = (double)scrW / 1024;
double scaleY = (double)scrH / 768;
// 應用於視窗 ClientWidth/Height、字型大小、控制項尺寸等
同樣原理可用於列印不同紙張尺寸的縮放控制。