解決WinForm程式在高DPI螢幕下介面縮放錯誤

阿遇而已發表於2024-09-02

在高DPI設定下,WinForm 應用程式的介面可能會出現扭曲或縮放不正確的問題。這是因為預設情況下,WinForm 的佈局和控制元件尺寸是基於標準 DPI 設計的,當在高DPI環境下執行時,介面可能會被強制縮放,導致控制元件排列不正確或模糊。

要解決這個問題,你可以嘗試以下幾種方法:

1. 啟用 DPI 感知 (DPI Awareness)

確保你的 WinForm 應用程式啟用了 DPI 感知功能,這樣 Windows 就不會自動縮放你的應用程式。
App.manifest 檔案中新增以下配置:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <!-- DPI Awareness 設定 -->
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
  </windowsSettings>
</application>

true/pm 設定表示程式將自行處理高DPI環境下的縮放,Windows 將不會對其進行強制縮放。

2. 使用自動縮放模式

WinForm 支援自動縮放模式,可以在表單的建構函式中啟用它:

public Form1()
{
    InitializeComponent();
    this.AutoScaleMode = AutoScaleMode.Dpi;
}

AutoScaleMode.Dpi 將根據當前 DPI 設定縮放控制元件,這可以幫助減少扭曲。

3. 處理高DPI的適配

你可能需要在程式碼中處理不同DPI設定下的佈局問題。例如,動態調整控制元件的大小和位置。

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    // 獲取當前DPI比例
    float dpiX, dpiY;
    using (Graphics g = this.CreateGraphics())
    {
        dpiX = g.DpiX;
        dpiY = g.DpiY;
    }

    // 根據DPI比例調整控制元件尺寸
    float scaleFactor = dpiX / 96f; // 96 DPI 是標準DPI
    foreach (Control control in this.Controls)
    {
        control.Width = (int)(control.Width * scaleFactor);
        control.Height = (int)(control.Height * scaleFactor);
        control.Left = (int)(control.Left * scaleFactor);
        control.Top = (int)(control.Top * scaleFactor);
        control.Font = new Font(control.Font.FontFamily, control.Font.Size * scaleFactor, control.Font.Style);
    }
}

4. 更新到更高版本的 .NET Framework

如果可能,考慮將專案升級到更新版本的 .NET Framework 或者 .NET Core/.NET 6,這些版本在處理高DPI方面有更好的支援和最佳化。

5. 設定高DPI模式為系統感知

你可以透過設定應用程式在高DPI模式下的行為,來讓系統進行縮放,而不是應用程式本身處理。這可以透過在 App.manifest 中設定如下程式碼:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <!-- 設定應用程式為系統感知 -->
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">system</dpiAware>
  </windowsSettings>
</application>

6. 避免絕對佈局

儘量避免使用絕對佈局(即透過畫素位置固定控制元件的位置),而使用 DockAnchor 屬性,這樣可以讓控制元件在不同DPI下更好地適應螢幕解析度。
透過以上方法,你應該能夠減少或解決 WinForm 應用程式在高DPI環境下出現的介面扭曲問題。

相關文章