1. 程式人生 > >解決winform應用程序在不同分辨率系統下界面錯亂的問題

解決winform應用程序在不同分辨率系統下界面錯亂的問題

() 問題 字體大小 設定 lock 分辨率 mic com 打印

首先,遇到的問題是這樣的,當已經ok的程序在我電腦上運行時出現了界面很小,而且錯亂無章的情況,如下圖:
技術分享圖片

記得上一次我的解決辦法是每個控件每個控件拖動修改,到最後perfect!可是??修改之後呢?半天時間沒有了,要做的事沒有挪動一步。。。。。
後來在網上查了查這是什麽原因:

問題分析:

產生界面混亂的主要原因是,winform程序的坐標是基於點(point)的,而point與DPI(分辨率,每英寸所打印點數)相關,一英寸等於72 Point,當DPI發生變化時,顯示在界面上的尺寸根據DPI自動變化,導致界面與設計之初產生錯亂。

解決方案

  • 方案一:利用AutoScaleMode屬性,將窗體的AutoScaleMode屬性設置為DPI。

    DPI:根據現實分辨率控制縮放,常用分辨率為 96 和 120 DPI.

    Font : 根據類使用的字體(通常為系統使用的字體)的維度控制縮放。

    Inherit:根據類的父類的縮放模式控制縮放。如果不存在父類,則禁用自動縮放。

    None: 禁用自動縮放。

  • 方案二: 借鑒web程序中以pixel(像素)為常用單位,在winform 程序中使用像素來定位,在form的構造函數中將窗體的AutoScaleMode屬性設置為Front.

 private void InitializeComponent()  
      { 
           //設定按字體來縮放控件  
           this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;  
           //設定字體大小為12px       
           this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, 
           System.Drawing.GraphicsUnit.Pixel, ((byte)(134)));  
      }
采用方案二更改後的效果;

技術分享圖片

結果來看,有個別控件未達到期望的效果。但相比之前真的是調整改善很多。比我當初一個個拖動修改要明智的多。

  • 方案三 :記錄下1920*1080分辨率下工作區域的Width和Height,記作DefaultWidth和DefaultHeight,用改變分辨率之後的工作區域的Width和Height去分別除以DefaultWidth和DefaultHeight,得到縮放比例,再調整主界面和各控件的縮放。
public class AutoReSizeForm
{
    static float SH
    {
        get
        {
             return (float)Screen.PrimaryScreen.Bounds.Height / DefaultHeight;
        }
    }
    static float SW
    {
        get
        {
             return (float)Screen.PrimaryScreen.Bounds.Width / DefaultWidth;
        }
    }
    
    public static void SetFormSize(Control fm)
    {
        fm.Location = new Point((int)(fm.Location.X * SW), (int)(fm.Location.Y * SH));
        fm.Size = new Size((int)(fm.Size.Width * SW), (int)(fm.Size.Height * SH));
        fm.Font = new Font(fm.Font.Name, fm.Font.Size * SH,fm.Font.Style,fm.Font.Unit,fm.Font.GdiCharSet,fm.Font.GdiVerticalFont);
        if (fm.Controls.Count!=0)
        {
            SetControlSize(fm);
        }
    }
     
    private static void SetControlSize(Control InitC)
    {
        foreach (Control c in InitC.Controls)
        {
            c.Location = new Point((int)(c.Location.X * SW), (int)(c.Location.Y * SH));
            c.Size = new Size((int)(c.Size.Width * SW), (int)(c.Size.Height * SH));
            c.Font = new Font(c.Font.Name, c.Font.Size * SH, c.Font.Style, c.Font.Unit, c.Font.GdiCharSet, c.Font.GdiVerticalFont);
            if (c.Controls.Count != 0)
            {
                SetControlSize(c);
            }
         }
    }
}

解決winform應用程序在不同分辨率系統下界面錯亂的問題