您的位置:首页 > 其它

Windows 窗体中的自动缩放(转自msdn)

2010-10-13 13:27 295 查看
通过自动缩放,可以使在具有特定显示分辨率或系统字体的计算机上设计的窗体及其控件也适合在另一台具有不同的显示分辨率或系统字体的计算机上显示。这样可以确保通过智能化方式调整窗体及其空关键的大小,使其同时与用户计算机和其他开发人员计算机上的本地窗口和其他应用程序保持一致。由于.net framework支持自动缩放和视觉样式,使得.net framework应用程序在与每个用户计算机的本机Windows应用程序进行比较时可以保持一致的外观。
自动缩放的必要性
在没有使用自动缩放的情况下,当改变显示分辨率或字体时,为该分辨率或字体设计的应用程序不是显得太大,就是显得太小。例如,假设应用程序是使用 Tahoma 9 point 为基准设计的,当在系统字体为 Tahoma 12 point 的计算机上运行时,如果不对它进行任何调整,该应用程序会显得很小。呈现的文本元素(如标题、菜单、文本框内容等)与其他应用程序相比都要小一些。此外,包含文本的用户界面 (UI) 元素(如标题栏、菜单和许多控件)的大小也与使用的字体相关联。在这种情况下,这些元素也会显得相对小些。
如果应用程序是针对某种显示分辨率设计的,也会发生类似的情况。最常用的显示分辨率是每英寸 96 点 (DPI),但是支持 120、133、170 及以上的更高分辨率的显示器也变得越来越常用。如果某个应用程序(特别是基于图形的应用程序)是为某种分辨率设计的,如果不进行调整,当该应用程序在另一种分辨率下运行时不是显得太大,就是显得太小。
自动缩放寻求解决这些问题,方法是按照相对字体大小或显示分辨率自动对窗体及其子控件进行调整。Windows 操作系统支持使用一种被称为对话框单位的相对度量单位自动对对话框进行缩放。对话框单位基于系统字体,它与像素的关系可以通过 Win32 SDK 函数 GetDialogBaseUnits 确定。当用户更改了 Windows 使用的主题时(分辨率,字体大小),会相应地自动调整所有对话框。另外,
.NET Framework 支持根据默认系统字体或显示分辨率自动缩放。也可以选择在应用程序中禁用自动缩放。
现在的自动缩放支持
在 .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 方法以更改当前控件的缩放逻辑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: