共用方式為


自動縮放

自動縮放功能允許某部電腦上以特定顯示解析度或字型所設計的表單和其控制項,可以在另一部電腦上以不同的顯示解析度或字型正確地顯示。 如此可確保表單和其控制項利用智慧方式調整大小,以便與使用者和其他開發人員電腦上的原生視窗和其他應用程式保持一致。 自動縮放和視覺樣式,可以讓 Windows Forms 應用程式在與每個使用者電腦上的原生 Windows 應用程式相較下,都能保有一致的外觀和風格。

在大多數情況下,自動縮放在 Windows Forms 中會如預期般運作。 不過,字型配置變更可能會造成問題。 如需如何解決此問題的範例,請參閱如何:回應 Windows Forms 應用程式中的字型配置變更

自動縮放的需求

如果沒有自動縮放功能,專為某種顯示解析度或字型所設計的應用程式會在該解析度或字型變更時,看起來太小或太大。 例如,如果應用程式在設計時使用新細明體 9 點做為基準,然後未經調整便在系統字型為新細明體 12 點的電腦上執行,則會看起來太小。 文字項目 (例如標題、功能表、文字方塊內容等) 的顯示將會比其他應用程式還要小。 此外,含有文字之使用者介面 (UI) 項目 (例如標題列、功能表和許多控制項) 的大小會取決於所使用的字型。 在這個範例中,這些項目看起來也會相對較小。

當應用程式是專為特定顯示解析度而設計時,就會發生類似的情況。 最常見的顯示解析度為 96 DPI (每英吋的點數),相當於 100% 顯示縮放,不過支援 125%、150%、200% (分別等於 120、144 和 192 DPI) 及較高解析度的顯示器已變得越來越普遍。 如果未經調整,專為某種解析度所設計的應用程式 (特別是圖形應用程式) 以另一種解析度執行時,便會看起來太大或太小。

自動縮放功能會根據相對字型大小或顯示解析度,自動調整表單和其子控制項的大小,以處理這些問題。 Windows 作業系統支援使用稱為對話方塊單位的相對測量單位,來自動縮放對話方塊。 對話框單位是以系統字型為基礎,而且其與像素的關聯性可透過Win32 SDK 函式 GetDialogBaseUnits來判斷。 當使用者變更 Windows 所使用的佈景主題時,所有對話方塊都會隨著自動調整。 此外,Windows Forms 支援根據預設系統字型或顯示解析度來進行自動縮放。 您可以選擇性地停用應用程式中的自動縮放功能。

謹慎

不支援 DPI 和字型縮放模式的任意混合。 雖然您可以使用某種模式 (例如 DPI) 縮放使用者控制項,並使用另一種模式 (字型) 將控制項置於表單上,而不會有任何問題,但是將某種模式中的基底表單與從另一種模式的衍生表單混合,可能會導致無法預期的結果。

執行自動縮放

Windows Forms 使用下列邏輯,來自動縮放表單和其內容:

  1. 在設計階段,每個 ContainerControl 會記錄縮放模式,以及各自在 AutoScaleModeAutoScaleDimensions 中的目前解析度。

  2. 在執行階段,實際的解析度會儲存在 CurrentAutoScaleDimensions 屬性中。 AutoScaleFactor 屬性動態計算執行階段縮放解析和設計階段縮放解析間的比率。

  3. 當表單載入時,如果 CurrentAutoScaleDimensionsAutoScaleDimensions 的值不同,則會呼叫 PerformAutoScale 方法以縮放控制項和其子系。 這個方法會暫止配置並呼叫 Scale 方法,以執行實際的縮放。 之後,AutoScaleDimensions 的值會更新以避免繼續縮放。

  4. 在下列情況下,也會自動叫用 PerformAutoScale

    • 為了在縮放模式為 Font 時回應 OnFontChanged 事件。

    • 當繼續容器控制項的配置,並在 AutoScaleDimensionsAutoScaleMode 屬性中偵測到變更時。

    • 如上所指,當縮放父 ContainerControl 時。 每個容器控制項會負責使用自已的縮放比例 (而非其父容器的縮放比例),來縮放其子系。

  5. 子控制項可以透過幾種方式,修改其縮放行為:

    • 可以覆寫 ScaleChildren 屬性,以判斷是否應該縮放其子控制項。

    • 可以覆寫 GetScaledBounds 方法,以調整控制項的縮放範圍,而不是縮放邏輯。

    • 可以覆寫 ScaleControl 方法,以變更目前控制項的縮放邏輯。

另請參閱