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

C++ Builder 控制元件隨視窗縮放自動定位與跨解析度適配

     編輯:VC 教學

問題背景

視覺化拖放開發雖快速,但控制項位置固定,視窗大小或螢幕解析度改變時版面易亂。需動態調整控制項位置/大小以保持相對佈局。

方法一:OnResize 事件逐一調整

利用表單 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;
}

方法二:遍歷 Controls 陣列批次處理

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) 分組管理

將相關控制項置於 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;
            }
        }
    }
}

跨解析度適配:GetDeviceCaps

使用 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、字型大小、控制項尺寸等

同樣原理可用於列印不同紙張尺寸的縮放控制。

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