[WinForm每日一帖] 如何使你的窗体样式固定,不因系统设定而变化
2007-05-30 12:57
435 查看
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
附:
[align=left]窗体和控件可以在所有 DPI 设置中自动调整大小,同时保持尺寸和位置比例不变。要在多个 DPI 设置中保持相同的比例(或称缩放),需要两个重要元素。第一个元素指示窗体进行自动缩放。第二个元素指示窗体对窗体及其控件的尺寸和位置应用什么缩放系数。默认情况下,窗体通过其 AutoScale 属性(设置为 true)进行自动缩放。缩放系数由 AutoScaleMode 属性指定,其值可以是下列值之一:[/align]
[align=left]enum AutoScaleMode {[/align]
[align=left]None = 0, // 不缩放[/align]
[align=left]Font = 1, // 根据字体大小缩放(默认值)[/align]
[align=left]Dpi = 2, // 根据 dpi 缩放[/align]
[align=left]Inherit = 3 // 继承容器的 AutoScaleMode[/align]
[align=left]}[/align]
[align=left]默认值为 Font,表示缩放系数是以窗体创建和执行窗体时默认系统字体平均宽度和高度的比率为基础的。例如,如果在 Windows XP 常规字体 (96 DPI) 下创建窗体,默认字体将为 8.25pt MS Sans Serif,平均宽度和高度为 6x13。此信息由 Windows 窗体设计器自动存储在窗体的 AutoScaleDimensions 属性中:[/align]
[align=left]// AutoScalingForm.designer.cs [/align]
[align=left]partial class AutoScalingForm {[/align]
[align=left] ...[/align]
[align=left]void InitializeComponent() {[/align]
[align=left] ...[/align]
[align=left]this.AutoScaleDimensions = new SizeF(6F, 13F);[/align]
[align=left] ...[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]如果后来在默认字体为 7.8pt MS Sans Serif 的大字体 (120 DPI) 下重新打开窗体或执行窗体,字体的平均宽度和高度将增加到 8x16。窗体会注意到 AutoScaleDimensions 与当前缩放尺寸之间的差异,然后根据计算的差异来调整其控件的宽度、高度和位置。这样一来,无论系统字体怎样设置,都可使窗体的总体外观保持大致相同。在 Visual Studio 内部同一行为也将保持一致。[/align]
[align=left]AutoSizeMode.Font 使缩放以各 DPI 之间的字体差异为基础,AutoSizeMode.Dpi 则使缩放完全以各 DPI 之间的差异为基础。图 9 对这两种模式做了比较。[/align]
[align=left]图 9 从 96 DPI 自动缩放到 120 DPI[/align]
AutoScaleMode.Font 和 AutoScaleMode.Dpi 之间在实际使用时的区别是,前后两者的缩放率不同,因为成比例字体的缩放方式不同于纯线性的 DPI 缩放,这一点在不同语言的缩放上体现的尤为明显。AutoScaleMode.Font 是默认选项,因为它是最可靠的选项。
由于不同系统的字符集设定会存在差异,导致在一个环境中开发的.NET Winform应用程序到另一个环境下变得显示不全或排列混乱
2. 解决方法
设置Form的属性AutoScaleMode 为None(默认为Font),设置Form的AutoSize属性为False(默认为False)
另解:设置Form的AutoSize为True,AutoSizeMode为GrowOnly,AutoScaleMode为Font, 可以达到不同设定下自动缩放Form及内部控件的效果
在Darwine开发中,我们将采用第一种方案,这样保证Form的风格统一
3. 分析
参见下面MSDN的解释;
如何设置DPI
附:
[align=left]窗体和控件可以在所有 DPI 设置中自动调整大小,同时保持尺寸和位置比例不变。要在多个 DPI 设置中保持相同的比例(或称缩放),需要两个重要元素。第一个元素指示窗体进行自动缩放。第二个元素指示窗体对窗体及其控件的尺寸和位置应用什么缩放系数。默认情况下,窗体通过其 AutoScale 属性(设置为 true)进行自动缩放。缩放系数由 AutoScaleMode 属性指定,其值可以是下列值之一:[/align]
[align=left]enum AutoScaleMode {[/align]
[align=left]None = 0, // 不缩放[/align]
[align=left]Font = 1, // 根据字体大小缩放(默认值)[/align]
[align=left]Dpi = 2, // 根据 dpi 缩放[/align]
[align=left]Inherit = 3 // 继承容器的 AutoScaleMode[/align]
[align=left]}[/align]
[align=left]默认值为 Font,表示缩放系数是以窗体创建和执行窗体时默认系统字体平均宽度和高度的比率为基础的。例如,如果在 Windows XP 常规字体 (96 DPI) 下创建窗体,默认字体将为 8.25pt MS Sans Serif,平均宽度和高度为 6x13。此信息由 Windows 窗体设计器自动存储在窗体的 AutoScaleDimensions 属性中:[/align]
[align=left]// AutoScalingForm.designer.cs [/align]
[align=left]partial class AutoScalingForm {[/align]
[align=left] ...[/align]
[align=left]void InitializeComponent() {[/align]
[align=left] ...[/align]
[align=left]this.AutoScaleDimensions = new SizeF(6F, 13F);[/align]
[align=left] ...[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]如果后来在默认字体为 7.8pt MS Sans Serif 的大字体 (120 DPI) 下重新打开窗体或执行窗体,字体的平均宽度和高度将增加到 8x16。窗体会注意到 AutoScaleDimensions 与当前缩放尺寸之间的差异,然后根据计算的差异来调整其控件的宽度、高度和位置。这样一来,无论系统字体怎样设置,都可使窗体的总体外观保持大致相同。在 Visual Studio 内部同一行为也将保持一致。[/align]
[align=left]AutoSizeMode.Font 使缩放以各 DPI 之间的字体差异为基础,AutoSizeMode.Dpi 则使缩放完全以各 DPI 之间的差异为基础。图 9 对这两种模式做了比较。[/align]
[align=left]图 9 从 96 DPI 自动缩放到 120 DPI[/align]
AutoScaleMode.Font 和 AutoScaleMode.Dpi 之间在实际使用时的区别是,前后两者的缩放率不同,因为成比例字体的缩放方式不同于纯线性的 DPI 缩放,这一点在不同语言的缩放上体现的尤为明显。AutoScaleMode.Font 是默认选项,因为它是最可靠的选项。
相关文章推荐
- [转]固定WinForm窗体样式,不因系统设定而变化
- [WinForm每日一帖] 如何使用UltraToolTipManager为控件提供带样式的ToolTip
- C#Winform窗体如何最小化到系统托盘
- [WinForm每日一帖] 如何制作复杂表头的Grid
- winform 窗体大小变化时,如何设置使控件一起按照比例变大
- 如何将Winform窗体最小化的时候将其显示到系统拖盘
- [WinForm每日一帖] 如何选中下拉框中指定的数据
- [WinForm每日一帖] 如何使用资源文件提供Excel模板下载
- [WinForm每日一帖] UltraGrid如何自定义Row Filter的值
- 关于MFC窗体样式随系统主题变化
- 如何将Winform窗体最小化的时候将其显示到系统拖盘
- [WinForm每日一帖] 如何使用UltraCurrencyEditor
- winform应用程序,如何让窗体固定显示在屏幕的某个位置。
- [WinForm每日一帖] 如何判断UltraGrid中是否选中数据
- [WinForm每日一帖] 如何验证Editor中输入的数据合法性
- winform如何实现子窗体关闭父窗体?
- 项目中在Android.mk文件中根据项目名称选择不同的AndroidManifest.xml文件 && 如何使用系统设定的日期显示格式
- C#里WinForm开发中如何实现控件随窗体大小的改变而自动适应其改变(转)
- winform中,如何控制控件位置随窗体的大小改变而改变
- 如何在多线程中调用winform窗体控件(转)