dotnet中Windows 窗体中的自动缩放

用中文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 窗体现在使用下面的逻辑自动对窗体及其内容进行缩放:

  1. 设计时,每一个 ContainerControl 分别在 AutoScaleMode 和 AutoScaleDimensions 中记录缩放模式和它的当前分辨率。

  2. 运行时,实际分辨率存储在 CurrentAutoScaleDimensions 属性中。AutoScaleFactor 属性会动态计算运行时分辨率与设计时分辨率的比值。

  3. 当加载窗体时,如果 CurrentAutoScaleDimensions 和 AutoScaleDimensions 的值不同,则会调用 PerformAutoScale 方法对该控件及其子控件进行缩放。此方法会挂起布局并调用 Scale 方法执行实际缩放。然后,会更新 AutoScaleDimensions 值以避免累进缩放。

  4. 在下面的情况下还会自动调用 PerformAutoScale:

    • 在缩放模式为 Font 时响应 OnFontChanged 事件。

    • 当继续执行容器控件的布局时检测到 AutoScaleDimensions 或 AutoScaleMode 属性发生更改。

    • 与上面的情况类似,检测到父 ContainerControl 正在被缩放。每个容器控件只负责使用自己的比例因子缩放自己的子控件,并不负责缩放其父容器中的控件。

  5. 子控件可以通过下面的若干方式修改其缩放行为:

    • 可以重写 ScaleChildren 属性以确定是否应缩放其子控件。

    • 可以重写 GetScaledBounds 方法以调整要将控件缩放至的边界,但不调整缩放逻辑。

    • 可以重写 ScaleControl 方法以更改当前控件的缩放逻辑。

posted on 2010-01-26 09:31  漫步人生  阅读(1246)  评论(0编辑  收藏  举报