一句话知识:如何解决winform自动缩放产生的布局问题.

一句话知识:如何解决winform自动缩放产生的布局问题.

有时候你会发现本来好好的WinForm程序在别的机器上显示的尺寸就不对了。这些问题主要发生在背景图片、图片框、窗口布局上。那么那就很可能是因为WinForm的自动放缩功能。

因为不同语言的系统使用不同的缺省字体,相同字体的系统也可能使用不同的DPI(字符的每英寸点数),传统的Win32程序在不同的系统上经常遇到文本显示不全的问题。.NETWinForm提供了自动放缩的功能来试图解决该问题。在v1.1里,Form有个AutoScale属性,但因错误地将放缩比例属性写成了整形,导致这套系统成了只能添乱的废物。在v2.0里,自动放缩系统被重新设计,并在Form的基类ContainerControl里加入了AutoScaleMode属性,提供几种不同的自动放缩模式,以便符合不同类型界面的需求:

1. Dpi:
控件根据相对设计时DPI的变化来放缩。常见的DPI96120。这种模式只对一些特定的图形控件有用。

2. Font:
控件根据相对设计时字体的变化来放缩。由于字体变化后宽和高的放缩比常常是不同的,所以这种方式会导致宽和高的不等比放缩。这个模式是Exe工程的缺省值。这对尽含有文本标签和系统控件的对话框很合适,但一旦有固定大小的控件或需要保持宽高比例的控件,就很容易毁掉原有的布局。

3. Inherit:
使用父控件的模式。这个选项经常用于自定义控件。

4. None:
不自动放缩。在其他模式无法实现合理的效果时,这是唯一的选择。

MSDN
里有一条警告:不被支持在同一窗口里将DPI模式和Font模式混合使用。但据我的实际经验,自动放缩和窗口布局的DockAnchor有时也会有冲突。也就是说目前的自动放缩功能仍不够理想。

其实本来GDI+的设计目标之一就是要解决文本的放缩问题。但GDI+在实现它的全部功能前就已经停止开发,也没有得到硬件加速,而GDI却不断升级,以致GDI的文本功能远远超过GDI+。更糟糕的是有些文本,尤其是阿拉伯语系的,在GDI+下都不能正确显示或根本不显示。所以.NET 2.0WinForm只能又重新回到GDI系统,包装了GDI的文本功能,也就是TextRenderer类,以便提供正确且更清晰更高效的文本显示。

 (以上内容来自网络)

 

将 Form 设置为this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;

 

下边的控件都设置为

 

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;

 

即可解决问题。

 

posted @ 2014-01-15 14:16  苏苏zhao  阅读(2097)  评论(0编辑  收藏  举报