C# WinForms 取得 Windows 顯示器縮放比例,調整 Graphics 繪製內容大小

筆者之前在 WinForms 專案中使用 Graphics 繪製圖形,其中遇到一個很大的問題就是如果使用者的螢幕縮放比例不是 100% 那畫出來的大小就會不同,不會依據縮放比例縮放,而會維持原來大小。該如何知道縮放比例呢?

預設 DPI 96 是 100%,所以我們可以使用下面的方式計算縮放比例:
    
public Form1()
{
    InitializeComponent();
    
    float scaleX = GetScalingFactorX();
    float scaleY = GetScalingFactorY();

    // 顯示縮放比例
    MessageBox.Show($"水平縮放比例: {scaleX}, 垂直縮放比例: {scaleY}");
}

private float GetScalingFactorX()
{
    using var graphics = CreateGraphics();
    return graphics.DpiX / 96f;
}

private float GetScalingFactorY()
{
    using var graphics = CreateGraphics();
    return graphics.DpiY / 96f;
}
    

那要調整繪製內容的大小就很簡單了,只要乘以縮放比例即可
    
protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    using Graphics graphics = CreateGraphics();
    Pen pen = new Pen(Color.Black, 1f);
    
    
    float scaleX = GetScalingFactorX();
    float scaleY = GetScalingFactorY();

    float lineDistance = 100f;
    // 縮放後的線段
    graphics.DrawLine(pen, 10f, 10f, 10f + lineDistance * scaleX, 10f + lineDistance * scaleY); 

    graphics.DrawLine(pen, 10f, 20f, 10f + 100, 20f+ 100); // 不縮放的線段
}
    

留言