dotnet中Windows 窗体中的自动缩放
2010-01-26 09:31
141 查看
用中文visual studio2005写的form在英文操作系统中窗体及控件大小居然发生了变化
原因是Form的AutoScaleMode属性的默认值是Font
MSDN上对AutoScaleMode的解释是:
AutoScaleMode 属性指定此控件的当前自动缩放模式。如果希望控件或窗体根据操作系统中字体的大小进行拉伸或缩小,则按 Font 缩放十分有用,如果控件或窗体的绝对大小无关紧要,则应使用这种方式进行缩放。如果要相对于屏幕确定控件或窗体的大小,则按 DPI 缩放十分有用。例如,对于显示图表或其他图形的控件,可能希望使用每英寸点数 (DPI) 缩放,以便该控件始终占据一定百分比的屏幕。 DotNet FrameWork2.0跟1.1的自动缩放模式不太一样,下面是MSDN的描述: 在 .NET Framework 版本 2.0 中,通过对 Windows 窗体的自动缩放进行下列更改而克服了前面提到的缺陷: 对缩放的基本支持已经移到 ContainerControl 类,这样窗体、本机复合控件和用户控件都会获得统一的缩放支持。此外,添加了 AutoScaleFactor、AutoScaleDimensions、AutoScaleMode 和 PerformAutoScale 这些新成员。
Control 类也拥有若干新成员,这些新成员允许该类参与缩放并支持在同一窗体上进行混合缩放。具体地说,是 Scale、ScaleChildren 和 GetScaledBounds 这些成员支持缩放。
作为系统字体支持的补充,已经添加了建立在屏幕分辨率基础上的缩放支持,如 AutoScaleMode 枚举所定义。此模式与 .NET Compact Framework 支持的自动缩放是兼容的,这样更易于进行应用程序的迁移。
与诸如 FlowLayoutPanel 和 TableLayoutPanel 等布局管理器的兼容性已经添加到自动缩放的实现中。
缩放比例因子现在表示为浮点值,通常使用 SizeF 结构,这样实际上已经消除了舍入误差。
自动缩放的执行过程是 Windows 窗体现在使用下面的逻辑自动对窗体及其内容进行缩放: 设计时,每一个 ContainerControl 分别在 AutoScaleMode 和 AutoScaleDimensions 中记录缩放模式和它的当前分辨率。
运行时,实际分辨率存储在 CurrentAutoScaleDimensions 属性中。AutoScaleFactor 属性会动态计算运行时分辨率与设计时分辨率的比值。
当加载窗体时,如果 CurrentAutoScaleDimensions 和 AutoScaleDimensions 的值不同,则会调用 PerformAutoScale 方法对该控件及其子控件进行缩放。此方法会挂起布局并调用 Scale 方法执行实际缩放。然后,会更新 AutoScaleDimensions 值以避免累进缩放。
在下面的情况下还会自动调用 PerformAutoScale: 在缩放模式为 Font 时响应 OnFontChanged 事件。
当继续执行容器控件的布局时检测到 AutoScaleDimensions 或 AutoScaleMode 属性发生更改。
与上面的情况类似,检测到父 ContainerControl 正在被缩放。每个容器控件只负责使用自己的比例因子缩放自己的子控件,并不负责缩放其父容器中的控件。
子控件可以通过下面的若干方式修改其缩放行为: 可以重写 ScaleChildren 属性以确定是否应缩放其子控件。
可以重写 GetScaledBounds 方法以调整要将控件缩放至的边界,但不调整缩放逻辑。
可以重写 ScaleControl 方法以更改当前控件的缩放逻辑。
原因是Form的AutoScaleMode属性的默认值是Font
MSDN上对AutoScaleMode的解释是:
AutoScaleMode 属性指定此控件的当前自动缩放模式。如果希望控件或窗体根据操作系统中字体的大小进行拉伸或缩小,则按 Font 缩放十分有用,如果控件或窗体的绝对大小无关紧要,则应使用这种方式进行缩放。如果要相对于屏幕确定控件或窗体的大小,则按 DPI 缩放十分有用。例如,对于显示图表或其他图形的控件,可能希望使用每英寸点数 (DPI) 缩放,以便该控件始终占据一定百分比的屏幕。 DotNet FrameWork2.0跟1.1的自动缩放模式不太一样,下面是MSDN的描述: 在 .NET Framework 版本 2.0 中,通过对 Windows 窗体的自动缩放进行下列更改而克服了前面提到的缺陷: 对缩放的基本支持已经移到 ContainerControl 类,这样窗体、本机复合控件和用户控件都会获得统一的缩放支持。此外,添加了 AutoScaleFactor、AutoScaleDimensions、AutoScaleMode 和 PerformAutoScale 这些新成员。
Control 类也拥有若干新成员,这些新成员允许该类参与缩放并支持在同一窗体上进行混合缩放。具体地说,是 Scale、ScaleChildren 和 GetScaledBounds 这些成员支持缩放。
作为系统字体支持的补充,已经添加了建立在屏幕分辨率基础上的缩放支持,如 AutoScaleMode 枚举所定义。此模式与 .NET Compact Framework 支持的自动缩放是兼容的,这样更易于进行应用程序的迁移。
与诸如 FlowLayoutPanel 和 TableLayoutPanel 等布局管理器的兼容性已经添加到自动缩放的实现中。
缩放比例因子现在表示为浮点值,通常使用 SizeF 结构,这样实际上已经消除了舍入误差。
自动缩放的执行过程是 Windows 窗体现在使用下面的逻辑自动对窗体及其内容进行缩放: 设计时,每一个 ContainerControl 分别在 AutoScaleMode 和 AutoScaleDimensions 中记录缩放模式和它的当前分辨率。
运行时,实际分辨率存储在 CurrentAutoScaleDimensions 属性中。AutoScaleFactor 属性会动态计算运行时分辨率与设计时分辨率的比值。
当加载窗体时,如果 CurrentAutoScaleDimensions 和 AutoScaleDimensions 的值不同,则会调用 PerformAutoScale 方法对该控件及其子控件进行缩放。此方法会挂起布局并调用 Scale 方法执行实际缩放。然后,会更新 AutoScaleDimensions 值以避免累进缩放。
在下面的情况下还会自动调用 PerformAutoScale: 在缩放模式为 Font 时响应 OnFontChanged 事件。
当继续执行容器控件的布局时检测到 AutoScaleDimensions 或 AutoScaleMode 属性发生更改。
与上面的情况类似,检测到父 ContainerControl 正在被缩放。每个容器控件只负责使用自己的比例因子缩放自己的子控件,并不负责缩放其父容器中的控件。
子控件可以通过下面的若干方式修改其缩放行为: 可以重写 ScaleChildren 属性以确定是否应缩放其子控件。
可以重写 GetScaledBounds 方法以调整要将控件缩放至的边界,但不调整缩放逻辑。
可以重写 ScaleControl 方法以更改当前控件的缩放逻辑。
相关文章推荐
- Windows 窗体中的自动缩放(转自msdn)
- C#winform设置窗体自动缩放适应不同尺寸的电脑屏幕大小
- 重点推荐:VB6.0 自动缩放窗体内控件的类代码
- 关于缩放 Windows 窗体 DataGridView 控件的最佳做法的介绍
- 缩放 Windows 窗体 DataGridView 控件的最佳做法
- C#WinForm仿qq窗体拖到windows窗体边上时,自动隐藏C#WinForm
- rem自适应 窗体大小自动 rem设置 改变rem来完成等比例缩放
- rem自适应 窗体大小自动 rem设置 改变rem来完成等比例缩放
- PowerBuilder9.0窗体控件自动缩放的实现
- rem自适应 窗体大小自动 rem设置 改变rem来完成等比例缩放
- 使用 TableLayoutPanel 在 Windows 窗体上自动排列控件
- 润乾报表根据浏览器窗体自动缩放
- 仿QQ 窗体拖到 windows窗体边上时,C#WinForm 自动隐藏
- WPF 仿QQ无边框窗体(自动隐藏/可缩放/最大化不覆盖任务栏)
- C#/winform设置窗体自动缩放适应不同尺寸的电脑屏幕大小
- C#WinForm仿qq窗体拖到windows窗体边上时,自动隐藏C#WinForm
- C#WinForm仿qq窗体拖到windows窗体边上时,自动隐藏C#WinForm
- delphi自动根据窗体大小缩放控件大小
- QT实现窗体自动缩放的快速实现方法
- TGridPanel做一个自动按比例缩放的窗体