Winform界面运行变形解决方案

Posted 常哥说编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Winform界面运行变形解决方案相关的知识,希望对你有一定的参考价值。

-Begin-

  现在高分屏的电脑越来越多,2K屏,4K屏层出不穷,对于.net开发人员来说,尤其是Winform开发者,分辨率一直是个比较头疼的事情,屏幕分辨率高了,如果仍然设置显示100%,会导致字体非常小,影响观看,因此很多时候推荐的都是150%,200%,如果主显示器设置不是100%,打开Winform项目时,会以同样的百分比进行窗体显示,会导致界面变形等一系列的问题。

  基于这种情形,在研究一番之后,给大家提供一下解决方案,主要有以下三种解决方案:

 

 

第一种是根据提示设置100%重启VS,但是这种每次都要重启,很麻烦,

第二种是我们等会要讲的,

第三种是设置主显示器为100%,如果能够接受100%显示,那直接设置成100%,然后重新设置一下UI布局,重启VS或者重启电脑就行了。

 

对于第二种解决方案,就是修改注册表:

 

 

 打开注册表,找到这个路径:

HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers 

右侧添加一个选项:

  • C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\IDE\\devenv.exe  针对VS2017

  • C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\IDE\\devenv.exe  针对VS2019 

这里是以社区版为例,这个其实就是VS的安装目录,如果是其他版本,将Community修改为对应版本即可。

 

接着设置类型和值:

Type: REG_SZ

Value: DPIUNAWARE

然后就可以了。

 

如果需要关掉这个提示:

 

 可以按照下面的方法执行(改成False):

 

解决winform应用程序在不同分辨率系统下界面错乱的问题

首先,遇到的问题是这样的,当已经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);
            }
         }
    }
}

  • 自己写的应用,布局中显示大小与运行之后显示的大小不一致问题:

在设计中首先选中form,查看属性,属性中设置 AutoSize值设置为true即可实现原设计大小与运行之后的现象一致。

以上是关于Winform界面运行变形解决方案的主要内容,如果未能解决你的问题,请参考以下文章

解决winform应用程序在不同分辨率系统下界面错乱的问题

winform界面怎么添加个加载中效果。

winform界面出不来如何解决?

winform 界面全屏

c# winform datagridview界面上的行删了,但datagridview数据源没有同步如何解决

Winform解决界面重绘闪烁的问题