电竞比分网-中国电竞赛事及体育赛事平台

分享

自動縮放

 長江黃鶴 2022-02-08

Windows 窗體中的自動縮放

  • 項目

借助自動縮放功能,在某臺計算機(jī)上以某種顯示分辨率或系統(tǒng)字體設(shè)計的窗體及其控件可以在其他計算機(jī)上以不同的顯示分辨率或系統(tǒng)字體適當(dāng)顯示。 它確保窗體及其控件將以智能方式調(diào)整大小,以便與本機(jī) Windows 以及用戶和其他開發(fā)人員的計算機(jī)上的其他應(yīng)用程序保持一致。 支持自動縮放和視覺樣式的 .NET Framework,使 .NET Framework 應(yīng)用程序與每個用戶的計算機(jī)上的本機(jī) Windows 應(yīng)用程序保持一致的外觀和感覺。

大多數(shù)情況下,自動縮放在 .NET Framework 版本2.0 及更高版本中按預(yù)期方式工作。 但是,字體方案更改可能會產(chǎn)生問題。 有關(guān)如何解決此問題的示例,請參閱如何:在 Windows 窗體應(yīng)用程序中響應(yīng)字體方案更改

自動縮放的必要性

若不進(jìn)行自動縮放,在分辨率或字體更改時,為某個顯示分辨率或字體設(shè)計的應(yīng)用程序?qū)@示太大或太小。 例如,如果應(yīng)用程序是使用 Tahoma 9 point 作為基準(zhǔn)而設(shè)計的,則在系統(tǒng)字體為 Tahoma 12 point 的計算機(jī)上運行時,若不進(jìn)行調(diào)整它將顯示太小。 與其他應(yīng)用程序相比,呈現(xiàn)的文本元素(如標(biāo)題、菜單、文本框內(nèi)容等)要小一些。 此外,包含文本的用戶界面 (UI) 元素(如標(biāo)題欄、菜單和很多控件)的大小均取決于所使用的字體。 在此示例中,這些元素的顯示也相對小一些。

如果應(yīng)用程序是針對某種顯示分辨率設(shè)計的,會發(fā)生類似情況。 最常見的顯示分辨率為每英寸 96 點 (DPI)(即 100% 的顯示比例),但支持 125%、150%、200%(分別等于 120、144 和 192 DPI)及以上的更高分辨率的顯示器也越來越常見。 如果不進(jìn)行調(diào)整,針對某個分辨率設(shè)計的應(yīng)用程序(特別是基于圖形的應(yīng)用程序)在其他分辨率上運行時就會顯示太大或太小。

自動縮放尋求解決這些問題,方法是更具相對字體大小或顯示分辨率自動調(diào)整窗體及其子控件的大小。 Windows 操作系統(tǒng)支持使用一種名為對話框單位的相對度量單位的自動縮放對話框。 對話框單位基于系統(tǒng)字體,并且它與像素的關(guān)系可由 Win32 SDK 函數(shù) GetDialogBaseUnits 確定。 當(dāng)用戶更改 Windows 使用的主題時,所有對話框均自動進(jìn)行相應(yīng)調(diào)整。 此外,.NET Framework 支持根據(jù)默認(rèn)系統(tǒng)字體或顯示分辨率進(jìn)行自動縮放。 或者,可在應(yīng)用程序中禁用自動縮放。

自動縮放的初始支持

.NET Framework 的版本1.0 和1.1 支持自動縮放,這種方式依賴于 UI 使用 Windows 默認(rèn)字體(由 Win32 SDK 值DEFAULT_GUI_FONT表示)。 通常,此字體只在顯示分辨率更改時才更改。 已使用以下機(jī)制來實現(xiàn)自動縮放:

  1. 在設(shè)計時,將 AutoScaleBaseSize 屬性(現(xiàn)已棄用)設(shè)置為開發(fā)人員計算機(jī)上默認(rèn)系統(tǒng)字體的高度和寬度。

  2. 在運行時,用戶計算機(jī)的默認(rèn)系統(tǒng)字體用于初始化 Form 類的 Font 屬性。

  3. 在顯示窗體前,調(diào)用 ApplyAutoScaling 方法以縮放窗體。 此方法計算 AutoScaleBaseSizeFont 的相對縮放大小,然后調(diào)用 Scale 方法來實際縮放窗體及其子窗體。

  4. 更新 AutoScaleBaseSize 的值,以便對 ApplyAutoScaling 的后續(xù)調(diào)用不會逐漸調(diào)整窗體大小。

雖然此機(jī)制足夠?qū)崿F(xiàn)大多數(shù)目的時,但具有以下限制:

  • 由于 AutoScaleBaseSize 屬性將基準(zhǔn)字體大小表示為整數(shù)值,因此當(dāng)窗體通過多個分辨率循環(huán)時,將會出現(xiàn)舍入誤差。

  • 自動縮放僅在 Form 類中實現(xiàn),無法在 ContainerControl 類中實現(xiàn)。 因此,只有在用戶控件的分辨率設(shè)計為與窗體的相同且在設(shè)計時置于窗體時,用戶控件才可正確縮放。

  • 窗體及其子控件只可由計算機(jī)分辨率相同的多名開發(fā)人員進(jìn)行同時設(shè)計。 同樣,如果窗體依賴與父窗體關(guān)聯(lián)的分辨率,也會被繼承。

  • 它與 .NET Framework 版本2.0 引入的較新布局管理器(如和)不兼容 FlowLayoutPanelTableLayoutPanel 。

  • 它不支持直接基于與 .NET Compact Framework 的兼容性所需的顯示分辨率進(jìn)行縮放。

雖然此機(jī)制保留在 .NET Framework 版本2.0 中以保持向后兼容性,但它已被下一步所述的更可靠的縮放機(jī)制所取代。 因此,AutoScaleApplyAutoScaling、AutoScaleBaseSize 和某些 Scale 重載被標(biāo)記為“已過時”。

備注

將舊代碼升級到 .NET Framework 版本2.0 時,可以安全刪除對這些成員的引用。

當(dāng)前支持自動縮放

.NET Framework 版本2.0 通過引入對 Windows 窗體自動縮放的以下更改來 surmounts 以前的限制:

  • 基本的縮放支持已移至 ContainerControl 類,以便窗體、本機(jī)復(fù)合控件和用戶控件均接收一致的縮放支持。 已添加新成員 AutoScaleFactor、AutoScaleDimensions、AutoScaleModePerformAutoScale。

  • Control 類還具有使其可參與縮放并支持在同一個窗體上的混合縮放的幾個新成員。 特別是 Scale、ScaleChildrenGetScaledBounds 成員支持縮放。

  • 已按照 AutoScaleMode 枚舉定義添加基于屏幕分辨率的縮放支持以補(bǔ)充系統(tǒng)字體支持。 此模式與支持的自動縮放兼容,使應(yīng)用程序遷移更輕松 .NET Compact Framework。

  • 已向自動縮放實現(xiàn)添加與布局管理器(如 FlowLayoutPanelTableLayoutPanel)的兼容性。

  • 縮放比例現(xiàn)在表示為浮點值,(通常采用 SizeF 結(jié)構(gòu)),以便幾乎消除舍入誤差。

注意

不支持任意混合的 DPI 和字體縮放模式。 雖然你可能成功使用某種模式(例如 DPI)縮放用戶控件并以另一種模式(字體)將其放在窗體上,但混合使用一種模式下的基窗體和其他模式下的派生窗體時可能導(dǎo)致意外結(jié)果。

操作中的自動縮放

Windows 窗體現(xiàn)在使用以下邏輯自動縮放窗體及其內(nèi)容:

  1. 在設(shè)計時,每個 ContainerControl 分別在 AutoScaleModeAutoScaleDimensions 中記錄縮放模式及其當(dāng)前的分辨率。

  2. 在運行時,實際的分辨率存儲在 CurrentAutoScaleDimensions 屬性中。 AutoScaleFactor 屬性動態(tài)計算運行時和設(shè)計時縮放分辨率之間的比率。

  3. 窗體加載時,如果 CurrentAutoScaleDimensionsAutoScaleDimensions 的值不同,則調(diào)用 PerformAutoScale 方法來縮放控件及其子項。 此方法將掛起布局并調(diào)用 Scale 方法來執(zhí)行實際縮放。 隨后將更新 AutoScaleDimensions 的值以避免漸進(jìn)式縮放。

  4. 在以下情況下也可自動調(diào)用 PerformAutoScale

    • 如果縮放模式為 Font,則響應(yīng) OnFontChanged 事件。

    • 當(dāng)容器控件的布局繼續(xù)執(zhí)行并在 AutoScaleDimensionsAutoScaleMode 屬性中檢測到更改時。

    • 如上所述,當(dāng)父 ContainerControl 正在縮放時。 每個容器控件負(fù)責(zé)使用自己的比例因子(而不是其父容器的比例因子)縮放其子控件。

  5. 子控件可通過多種方式修改其縮放行為:

    • 可重寫 ScaleChildren 屬性以確定是否應(yīng)縮放其子控件。

    • 可重寫 GetScaledBounds 方法以調(diào)整控件縮放到的邊界,但不是調(diào)整縮放邏輯。

    • 可重寫 ScaleControl 方法以更改當(dāng)前控件的縮放邏輯。

另請參閱

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多