winform显示器适配(解决字体模糊,界面错乱,多屏适配)

最近做的一个软件,内部测试的时候有人把显示器放大了300%,导致界面空间重叠错乱了,之前在双屏幕运行的时候也有出现字体模糊的问题,就一起解决了。

步骤如下:

1. (我所有控件都包含到一个panel里面)将这个form设置缩放为取消缩放(或者像素缩放),并且子控件要么别设置,要么请一定将缩放模式和窗口的缩放模式相同:

this.AutoScaleMode = AutoScaleMode.None;

this.AutoScaleMode = AutoScaleMode.Dpi;

2  设置字的单位是像素,而不是Point:可以解决绝大多数字体模糊的问题

            this.TextTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 32.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel, ((byte)(0)));
 

以下是解释:

1. 不同显示器中,屏幕每一个像素长度和宽度不一样,如果设置了缩放,界面在不同屏幕上会有不同的效果。在winform中,我们设置高度宽度和定位的时候:

this.TextTitle.Location = new System.Drawing.Point(87, 21);
this.TextTitle.Size = new System.Drawing.Size(109, 38);

测试:当我屏幕缩小放大的时候,控件的宽度视觉上不会发生变化。但是当我使用其他分辨率时,控件的高宽会明显变大。字体也是!(所以我觉得控件内部的单位也是像素)

System.Drawing.GraphicsUnit.Pixel

Specifies a device pixel as the unit of measure.(将设备像素指定为度量单位)

System.Drawing.GraphicsUnit.Point

Specifies a printer's point (1/72 inch) as the unit of measure.(指定打印机的点(1/72英寸)作为度量单位)

2 当我在大屏幕上测试完,缩放屏幕显示正常之后拿到笔记本屏幕上查看,出现了界面显示不完全的情况。这个时候我的缩放模式是这个:AutoScaleMode.Dip, 先看一下微软的文档:

The AutoScaleMode property specifies the current automatic scaling mode of this control. Scaling by Font is useful if you want to have a control or form stretch or shrink according to the size of the fonts in the operating system, and should be used when the absolute size of the control or form does not matter. Scaling by Dpi is useful when you want to size a control or form relative to the screen. For example, you may want to use dots per inch (DPI) scaling on a control displaying a chart or other graphic so that it always occupies a certain percentage of the screen.

谷歌翻译如下:

    所述AutoScaleMode属性指定此控制的当前自动缩放模式。如果希望控件或窗体根据操作系统中字体的大小拉伸或缩小,则按字体缩放很有用,当控件或窗体的绝对大小无关紧要时,应使用“按比例缩放” 。当您要相对于屏幕调整控件或窗体的大小时,按Dpi缩放很有用。例如,您可能希望在显示图表或其他图形的控件上使用每英寸点数(DPI)缩放,以使其始终占据屏幕的特定百分比。

我理解了一下,就是说:

Dpi

会根据屏幕缩放控件宽和高(不同的分辨率缩放)

Font

根据系统字体缩放控件的宽和高(缩放屏幕会修改字体大小)

None

禁用自动缩放

因为我界面的子panel(自定义用户控件Panel)有的用的缩放是Font,而窗口被我弄成了Dpi,这导致两者比例出现了偏差,窗口变小了,而面板没啥变化,反正两者各自缩放的比例不一样,甚至有些面板没有设置缩放,这就导致了界面有的控件都没显示出来。

 

关于Dpi缩放,我看到很多说修改App.manifest+App.config,我的项目中没有用这一条,用过后没发现有什么区别就注释了。

 

所以,控件窗口的缩放模式一定要一致。

缩放模式这一条的后续:

吃饭之前我用笔记本复现了这个现象,然下午我刚刚再次复测的时候怎么都复现不了了,但是为了避免出错,尽量全局一致,避免产生问题。

你可能感兴趣的:(Winform)