如何解决winform自动缩放产生的布局问题.
转自:http://www.cnblogs.com/KenBlove/articles/1281823.html
有时候你会发现本来好好的WinForm程序在别的机器上显示的尺寸就不对了。这些问题主要发生在背景图片、图片框、窗口布局上。那么那就很可能是因为WinForm的自动放缩功能。
因为不同语言的系统使用不同的缺省字体,相同字体的系统也可能使用不同的DPI(字符的每英寸点数),传统的Win32程序在不同的系统上经常遇到文本显示不全的问题。.NET的WinForm提供了自动放缩的功能来试图解决该问题。在v1.1里,Form有个AutoScale属性,但因错误地将放缩比例属性写成了整形,导致这套系统成了只能添乱的废物。在v2.0里,自动放缩系统被重新设计,并在Form的基类ContainerControl里加入了AutoScaleMode属性,提供几种不同的自动放缩模式,以便符合不同类型界面的需求:
1. Dpi: 控件根据相对设计时DPI的变化来放缩。常见的DPI有96和120。这种模式只对一些特定的图形控件有用。
2. Font: 控件根据相对设计时字体的变化来放缩。由于字体变化后宽和高的放缩比常常是不同的,所以这种方式会导致宽和高的不等比放缩。这个模式是Exe工程的缺省值。这对尽含有文本标签和系统控件的对话框很合适,但一旦有固定大小的控件或需要保持宽高比例的控件,就很容易毁掉原有的布局。
3. Inherit: 使用父控件的模式。这个选项经常用于自定义控件。
4. None: 不自动放缩。在其他模式无法实现合理的效果时,这是唯一的选择。
MSDN里有一条警告:不被支持在同一窗口里将DPI模式和Font模式混合使用。但据我的实际经验,自动放缩和窗口布局的Dock、Anchor有时也会有冲突。也就是说目前的自动放缩功能仍不够理想。
其实本来GDI+的设计目标之一就是要解决文本的放缩问题。但GDI+在实现它的全部功能前就已经停止开发,也没有得到硬件加速,而GDI却不断升级,以致GDI的文本功能远远超过GDI+。更糟糕的是有些文本,尤其是阿拉伯语系的,在GDI+下都不能正确显示或根本不显示。所以.NET 2.0的WinForm只能又重新回到GDI系统,包装了GDI的文本功能,也就是TextRenderer类,以便提供正确且更清晰更高效的文本显示。
(以上内容来自网络)
将 Form 设置为this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
下边的控件都设置为
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
即可解决问题。
自己补充:
一般我们在窗体设计的时候都会对控件进行位置的设置。
比如说:
FORM1 为 600*600 那么你的的控件正确摆放位置也只限于这个范围内。如果你想在最大化为1024*768 那么控件的位置肯定会发生改变。以致最大化后的窗体一部分地方是空白的,
以600*600为列子
解决方案一:你可以在设计的时候把窗体的长宽定格在600*600,不让用户最大化,当然你想设计成1024*768也是可以的。
解决方案二:采用流布局:工具箱里边容器里有一个:FlowLayoutPanel的控件。你可以把这个控件Panel加进你的FORM,再在这个布局控件上面添加你的控件。这样,不管你的窗体初始大小是多大都可以使你的窗体在最大化的时候,或者改变窗体大小的时候,里边的控件也随着一起变大或者变小。不影响界面!
如果使用的不是FlowLayoutPanel控件,则可以用panel控件,把控件进行分区,然后设置空间的Dock和Anchor属性。
设定anchor属性,这样控件的边界就会跟窗体的边界始终保持一定的距离而不管窗体如何缩放
anchor可以做到固定缩放,但无法做到按比例缩放
浙公网安备 33010602011771号