图月志 2018-01-28
1.原由
由于不同系统的字符集设定会存在差异,导致在一个环境中开发的.NET Winform应用程序到另一个环境下变得显示不全或排列混乱
2.解决方法
设置Form的属性AutoScaleMode 为None(默认为Font),设置Form的AutoSize属性为False(默认为False)
另解:设置Form的AutoSize为True,AutoSizeMode为GrowOnly,AutoScaleMode为Font, 可以达到不同设定下自动缩放Form及内部控件的效果
在Darwine开发中,我们将采用第一种方案,这样保证Form的风格统一
3.分析
参见下面MSDN的解释;
如何设置DPI
附:
窗体和控件可以在所有 DPI 设置中自动调整大小,同时保持尺寸和位置比例不变。要在多个 DPI 设置中保持相同的比例(或称缩放),需要两个重要元素。第一个元素指示窗体进行自动缩放。第二个元素指示窗体对窗体及其控件的尺寸和位置应用什么缩放系数。默认情况下,窗体通过其 AutoScale 属性(设置为 true)进行自动缩放。缩放系数由 AutoScaleMode 属性指定,其值可以是下列值之一:
enum AutoScaleMode {
None = 0, // 不缩放
Font = 1, // 根据字体大小缩放(默认值)
Dpi = 2, // 根据 dpi 缩放
Inherit = 3 // 继承容器的 AutoScaleMode
}
默认值为 Font,表示缩放系数是以窗体创建和执行窗体时默认系统字体平均宽度和高度的比率为基础的。例如,如果在 Windows XP 常规字体 (96 DPI) 下创建窗体,默认字体将为 8.25pt MS Sans Serif,平均宽度和高度为 6x13。此信息由 Windows 窗体设计器自动存储在窗体的 AutoScaleDimensions 属性中:
// AutoScalingForm.designer.cs
partial class AutoScalingForm {
...
void InitializeComponent() {
...
this.AutoScaleDimensions = new SizeF(6F, 13F);
...
}
}
如果后来在默认字体为 7.8pt MS Sans Serif 的大字体 (120 DPI) 下重新打开窗体或执行窗体,字体的平均宽度和高度将增加到 8x16。窗体会注意到 AutoScaleDimensions 与当前缩放尺寸之间的差异,然后根据计算的差异来调整其控件的宽度、高度和位置。这样一来,无论系统字体怎样设置,都可使窗体的总体外观保持大致相同。在 Visual Studio 内部同一行为也将保持一致。
AutoSizeMode.Font 使缩放以各 DPI 之间的字体差异为基础,AutoSizeMode.Dpi 则使缩放完全以各 DPI 之间的差异为基础。图9 对这两种模式做了比较。
图 9 从 96 DPI 自动缩放到 120 DPI
AutoScaleMode.Font和AutoScaleMode.Dpi之间在实际使用时的区别是,前后两者的缩放率不同,因为成比例字体的缩放方式不同于纯线性的DPI缩放,这一点在不同语言的缩放上体现的尤为明显。AutoScaleMode.Font是默认选项,因为它是最可靠的选项。