调整 Windows 窗体的大小和比例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
调整 Windows 窗体的大小和比例
.NET Framework 4.5
其他版本
此主题尚未评级 - 评价此主题
本主题提供一些链接,这些链接指向有关调整 Windows 窗体大小的信息。
本节内容
如何:调整 Windows 窗体的大小
提供有关指定 Windows 窗体大小的说明。
Windows 窗体中的自动缩放
讨论自动缩放功能如何使窗体及其控件在计算机之间正确地显示。
参考
Size
描述此类并提供指向其所有成员的链接。
TableLayoutPanel
描述此类并提供指向其所有成员的链接。
FlowLayoutPanel
描述此类并提供指向其所有成员的链接。
相关章节
更改 Windows 窗体外观
提供指向一些主题的链接,这些主题描述更改 Windows 窗体外观的其他方法。
如何:使用设计器调整Windows 窗体的大小
.NET Framework 4.5
其他版本
此主题尚未评级 - 评价此主题
有多种方式可指定 Windows 窗体的大小。
在 Visual Studio 中,可以通过使用“Windows 窗体设计器”或“属性”窗口来更改窗体的大小。
有关通过使用代码更改窗体大小的信息,请参见如何:调整 Windows 窗体的大小。
说明
在Windows 窗体设计器中调整窗体的大小
1.在 Windows 窗体设计器中,单击该窗体以选定它。
2.单击并拖动窗体边框上出现的八个尺寸柄中的一个。
尺寸柄看起来象小
说明
使用“属性”窗口调整窗体的大小
说明
请参见
任务
演练:创建可根据数据输入需要调整大小的Windows 窗体
演练:创建可根据本地化需要调整比例的布局
如何:使用AutoSize 属性和TableLayoutPanel 控件支持对Windows 窗体的本地化
如何:调整Windows 窗体上控件的大小
参考
Windows 窗体概述
概念
Windows 窗体中的自动缩放
其他资源
调整Windows 窗体的大小和比例
创建新的Windows 窗体
社区附加资源
如何:调整 Windows 窗体的大小
.NET Framework 4.5
其他版本
可以通过几种方式指定 Windows 窗体的大小。
可以为Size属性设置新的值以便用编程方式来更改窗体的高度和宽度,还可以单独调整Height或Width属性。
如果使用 Visual Studio,则可以使用 Windows 窗体设计器来更改大小。
以编程方式调整窗体的大小
∙通过设置窗体的Size属性,可以在运行时定义窗体的大小。
下面的代码示例显示设置为 100 × 100 像素的窗体大小:
C#
C++
VB
Form1.Size = New System.Drawing.Size(100, 100)
以编程方式更改窗体的宽度和高度
∙定义Size后,请使用Width或Height属性更改窗体的高度或宽度。
下面的代码示例演示将窗体宽度设置为距窗体左边缘 300 个像素,而高度保持不变。
C#
C++
VB
Form1.Width = 300
- 或 -
通过设置Size属性,更改Width或Height。
但是,如以下代码所示,与仅设置Width或Height属性相比,此方法要麻烦的多。
C#
C++
VB
Form1.Size = New Size(300, Form1.Size.Height)
以编程方式按增量更改窗体大小
若要增加窗体的大小,请设置Width和Height属性。
下面的代码示例显示设置为比当前设置宽 200 像素的窗体宽度。
C#
C++
VB
Form1.Width += 200
警告
C#
C++
VB
' NOTE: CODE WILL NOT COMPILE
Dim f As New Form()
f.Size.Width += 100
请参见
其他资源
Windows 窗体入门
增强Windows 窗体应用程序
演练:创建可根据数据输入需要调整大小的Windows 窗体
.NET Framework 4.5
其他版本
能够正确调整大小的窗体可以提高您的用户界面的易用性。
此演练演示了如何创建当用户调整窗体大小时按比例调整的布局。
您将使
用TableLayoutPanel控件实现一个接收联系人信息的数据输入窗体。
本演练涉及以下任务:
∙创建项目
∙创建布局面板
∙设置布局网格
∙创建“姓名”字段
∙创建“地址”字段
∙创建“电话号码”字段
∙创建“备注”字段
完成这些操作后,窗体应如下所示:
若要复制此主题中的完整代码列表,请参见如何:创建用于数据输入的大小可调说明
系统必备
若要完成本演练,您需要:
∙足够的权限,以便能够在安装 Visual Studio 的计算机上创建和运行Windows 窗体应用程序项目。
创建项目
第一步是创建应用程序项目。
使用此项目生成显示数据输入窗体的应用程序。
创建项目
∙创建名为 DemoDataEntryLayout 的 Windows 应用程序项目。
有关更多信息,请参见如何:创建新的 Windows 窗体应用程序项目。
创建布局面板
下一步是创建包含可调整大小的布局的布局面板。
创建布局面板
1.在“窗体设计器”中选择窗体。
2.从“工具箱”中将一个TableLayoutPanel控件拖到窗体上。
3.在“属性”窗口中,将TableLayoutPanel控件的Dock属性的值更改
为Fill。
4.将ColumnCount属性的值更改为 4,并将RowCount属性的值更改为 6。
设置布局网格
下一步是指定布局网格。
设置ColumnStyles和RowStyles集合中的属性以确定当窗体的尺寸改变时列和行如何调整大小。
设置布局网格
1.单击TableLayoutPanel控件的智能标记符号 () 并选择“编辑行和
列”以打开“列和行样式”对话框。
有关更多信息,请参见如何:在
TableLayoutPanel 控件中编辑行和列。
2.从“显示”下拉框中选择“列”。
3.选择第一列并将其SizeType属性的值更改为Percent。
将“百分
比”NumericUpDown控件的值设置为 25。
此列将容纳Label控件。
4.选择第二列。
将其SizeType属性的值更改为Percent。
将“百分
比”NumericUpDown控件的值设置为 50。
此列将容纳数据输入字段
的TextBox控件。
5.选择第三列。
将其SizeType属性的值更改为Percent。
将“百分
比”NumericUpDown控件的值设置为 25。
此列将容纳Label控件。
6.选择第四列。
将其SizeType属性的值更改为Percent。
将“百分
比”NumericUpDown控件的值设置为 50。
此列将容纳数据输入字段
的TextBox控件。
7.从“显示”下拉框中选择“行”。
8.对于前面五行,将SizeType属性的值设置为Absolute,并将“绝
对”NumericUpDown控件的值设置为 28。
对于第六行,将SizeType属性的值设置为Percent,并将“百分比”NumericUpDown控件的值设置为80。
9.单击“确定”接受更改。
用控件填充该布局
现在可以使用控件填充布局了。
此数据输入窗体是用于联系人信息的,所以它有“名”字段、“姓”字段、“地址”字段、“电话号码”字段和“备注”字段。
下面的列表显示了创建这些控件的顺序:
1.“姓名”字段
2.“地址”字段
3.“电话号码”字段
4.“备注”字段
创建“姓名”字段
姓名输入字段置于TableLayoutPanel控件的第一行。
它们由Label控件
和TextBox控件(用于输入名)以及Label控件和TextBox控件(用于输入姓)组成。
创建“姓名”字段
1.将一个Label控件从“工具箱”拖到TableLayoutPanel控件中的第一
个单元格中。
2.在“属性”窗口中,将Label控件的Anchor属性的值设置为Right。
3.将AutoSize属性的值设置为true。
4.将Text属性的值设置为“名”。
5.将一个TextBox控件从“工具箱”拖到第一行的第二单元格中,位
于Label控件旁边。
6.将TextBox控件的Anchor属性的值设置为Left、Right。
7.将一个Label控件从“工具箱”拖到第一行的第三个单元格
中。
将Label控件的Anchor属性的值设置为Right。
将AutoSize属性的值设置为true。
将Text属性的值设置为“姓”。
8.将一个TextBox控件从“工具箱”拖到第一行的第四个单元格
中。
将TextBox控件的Anchor属性的值设置为Left、Right。
创建“地址”字段
“地址”字段占用第二、三、四行。
因为街道地址可能很长,所
以Address1 和Address2 字段跨三列。
创建“地址”字段
1.将一个Label控件从“工具箱”拖到第二行的第一个单元格中。
2.在“属性”窗口中,将Label控件的Anchor属性的值设置
为Right。
将AutoSize属性的值设置为true。
将Text属性的值设
置为“地址1”。
3.将一个TextBox控件从“工具箱”拖到第二行的第二单元格中,位
于Label控件旁边。
4.将TextBox控件的Anchor属性的值设置为Left、Right。
5.将“ColumnSpan”属性的值设置为 3。
此属性由TableLayoutPanel控
件提供。
有关所提供的属性的更多信息,请参见扩展程序提供程序概述。
6.对第三行重复步骤 1 到 5。
将Label控件的Text属性的值设置为
“地址2”。
7.将一个Label控件从“工具箱”拖到第四行的第一个单元格中。
8.将Label控件的Anchor属性的值设置为Right。
将AutoSize属性的
值设置为true。
将Text属性的值设置为“城市”。
9.将一个TextBox控件从“工具箱”拖到第四行的第二单元格中,位
于Label控件旁边。
10.将TextBox控件的Anchor属性的值设置为Left、Right。
11.将一个Label控件从“工具箱”拖到第四行的第三个单元格中。
12.将Label控件的Anchor属性的值设置为Right。
将AutoSize属性的
值设置为true。
将Text属性的值设置为“州/省”。
13.将一个ComboBox控件从“工具箱”拖到第四行的第四个单元格中。
14.将ComboBox控件的Anchor属性的值设置
为Left。
将FormattingEnabled属性的值设置为true。
创建“电话号码”字段
“电话号码”字段占用第五行。
若要确保用户仅输入有效电话号码,请使
用MaskedTextBox控件来实现。
创建“电话号码”字段
1.将一个Label控件从“工具箱”拖到第五行的第一个单元格中。
2.在“属性”窗口中,将Label控件的Anchor属性的值设置
为Right。
将AutoSize属性的值设置为true。
将Text属性的值设
置为“工作电话”。
3.将一个MaskedTextBox控件从“工具箱”拖到第五行的第二个单元格
中。
4.将MaskedTextBox控件的Anchor属性的值设置为Left。
5.单击MaskedTextBox控件上的智能标记 () 以打开Mask编辑器。
6.在“输入掩码”对话框中选择“电话号码”掩码。
单击“确定”。
7.对“家庭电话号码”字段重复步骤 1 到 5。
将Text属性的值设置为
“家庭电话”。
创建“备注”字段
最后一个字段占用第六行。
它用于输入备注并且允许任意形式的文本输入。
创建“备注”字段
1.将一个Label控件从“工具箱”拖到第六行的第一个单元格中。
2.在“属性”窗口中,将Label控件的Anchor属性的值设置为Top、
Right。
将AutoSize属性的值设置为true。
将Text属性的值设置为“备注”。
3.将一个RichTextBox控件从“工具箱”拖到第六行的第二个单元格中。
4.将“ColumnSpan”属性的值设置为 3。
5.将RichTextBox控件的Dock属性的值设置为Fill。
完成布局网格设置
最后一步是完成布局网格设置。
第一列和第三列应设置为AutoSize。
由于已在这些列中放置了控件,因此在设计时这些列可见。
设置布局网格
1.选择TableLayoutPanel控件并单击其智能标记标志符号 ()。
选择“编
辑行和列”打开“列和行样式”对话框。
有关更多信息,请参见如何:在 TableLayoutPanel 控件中编辑行和列。
2.从“显示”下拉框中选择“列”。
3.选择第一列和第三列并将SizeType属性的值更改为AutoSize。
4.单击“确定”接受更改。
检查点
至此,可以运行应用程序以检查窗体的动态布局。
检查窗体的布局
说明
后续步骤
注意,您可以创建实现动态布局的窗体,使窗体适于本地化。
有关更多信息,请参见演练:创建可根据本地化需要调整比例的布局。
请参见
任务
如何:创建用于数据输入的大小可调的Windows 窗体
演练:使用TableLayoutPanel 在Windows 窗体上排列控件
演练:使用FlowLayoutPanel 在Windows 窗体上排列控件
如何:在TableLayoutPanel 控件中编辑行和列
演练:使用Padding、Margins 和AutoSize 属性对Windows 窗体控件进行布局
如何:使用AutoSize 属性和TableLayoutPanel 控件支持对Windows 窗体的本地化
演练:使用Windows 窗体控件上的智能标记执行常规任务
演练:创建可根据本地化需要调整比例的布局
参考
TableLayoutPanel
FlowLayoutPanel
社区附加资源
Windows 窗体中的自动缩放
.NET Framework 4.5
其他版本
通过自动缩放,可以使在具有特定显示分辨率或系统字体的计算机上设计的窗体及其控件也适合在另一台具有不同的显示分辨率或系统字体的计算机上显示。
这样可以确保通过智能化方式调整窗体及其控件的大小,使其同时与用户计算机和其他开发人员计算机上的本地窗口和其他应用程序保持一致。
由于 .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 版本 1.0 和 1.1 中支持的自动缩放采用一种很直接的方法,这种方法依赖于 UI 使用的 Windows 默认字体,该字体由 Win32 SDK 值DEFAULT_GUI_FONT表示。
这种字体通常只在显示分辨率改变时才会改变。
下面的机制用于实现自动缩放:
1.设计时,AutoScaleBaseSize属性(现在已被废弃)被设置为开发人员计算机上默认系
统字体的高度和宽度。
2.运行时,使用用户计算机上的默认系统字体初始化Form类的Font属性。
3.在显示窗体之前,会调用ApplyAutoScaling方法来缩放窗体。
此方法通
过AutoScaleBaseSize和Font计算相对缩放尺寸,然后调用Scale方法实际缩放窗体及其子控件。
4.AutoScaleBaseSize值已更新,这样后来调用ApplyAutoScaling时不会累进调整窗
体。
虽然此机制在大部分情况下可满足需要,但是它具有下列缺陷:
∙由于AutoScaleBaseSize属性将基线字体大小表示为整数值,所以某个窗体在经历多次分辨率更改后,发生的舍入误差会变得很明显。
∙仅在Form类中实现了自动调整,但没有在ContainerControl类中实现。
所以,只有当用户控件与窗体在相同的分辨率下进行设计并在设计阶段将控件放入窗体中,用户控件才能正确缩放。
∙只有在多个开发人员的计算机分辨率都相同的情况下,才能由这些开发人员同时设计窗体及其子控件。
同样,这还会使窗体的继承依赖于与父窗体关联的分辨率。
∙它与 .NET Framework 版本 2.0 中引入的更新的布局管理器
(如FlowLayoutPanel和TableLayoutPanel)不兼容。
∙它不支持直接根据与 .NET Compact Framework 兼容所需的显示分辨率进行缩放。
虽然此机制在 .NET Framework 版本 2.0 中得到保留以维护向后兼容性,但它已由下面介绍的更可靠的缩放机制所取代。
因而,AutoScale、ApplyAutoScaling、AutoScaleBaseSize和某些Scale重载已被标记为过时。
说明
现在的自动缩放支持
在 .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:
o在缩放模式为Font时响应OnFontChanged事件。
o当继续执行容器控件的布局时检测
到AutoScaleDimensions或AutoScaleMode属性发生更改。
o与上面的情况类似,检测到父ContainerControl正在被缩放。
每个容器控件只负责使用自己的比例因子缩放自己的子控件,并不负责缩放其父容器中的控
件。
5.子控件可以通过下面的若干方式修改其缩放行为:
o可以重写ScaleChildren属性以确定是否应缩放其子控件。
o可以重写GetScaledBounds方法以调整要将控件缩放至的边界,但不调整缩放逻辑。
o可以重写ScaleControl方法以更改当前控件的缩放逻辑。
请参见
任务
如何:启用Windows XP 视觉样式
如何:通过避免自动缩放改善性能
参考
AutoScaleMode
Scale
PerformAutoScale
AutoScaleDimensions
概念
使用视觉样式呈现控件
如何:在 Windows 窗体应用程序中响应字体方案更改
.NET Framework 4.5
其他版本
在 Windows 操作系统中,用户可以更改系统级的字体设置,使默认字体显示得更大或更小。
更改这些字体设置对于视力受损的用户尤为关键,因为他们需要屏幕上显示较大的文本才能进行阅读。
每当字体方案发生更改时,可以通过增加或减小窗体以及所有包含文本的大小,来调整Windows 窗体应用程序以响应这些更改。
如果想让窗体动态适应字号的更改,可以向窗体添加代码。
通常,Windows 窗体使用的默认字体是Microsoft.Win32命名空间调
用GetStockObject(DEFAULT_GUI_FONT)所返回的字体。
此调用所返回的字体只在屏幕分辨率发生变化时才会更改。
如下面的过程所示,您的代码必须将默认字体更改
为IconTitleFont,以响应字号的更改。
使用桌面字体和响应字体方案更改
1.创建窗体,并向该窗体添加您需要的控件。
有关更多信息,请参见如何:从命令行创
建 Windows 窗体应用程序和在 Windows 窗体上使用的控件。
2.向代码中添加对Microsoft.Win32命名空间的引用。
C#
VB
Imports Microsoft.Win32
3.将下面的代码添加到窗体的构造函数中,以挂接所需的事件处理程序,并更改窗体使用
的默认字体。
C#
VB
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
AddHandler erPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf
SystemEvents_UserPreferenceChangesEventHandler)
End Sub
4.实现UserPreferenceChanged事件的处理程序,当Window类别更改时,该事件将导
致窗体自动缩放。
C#
VB
Private Sub SystemEvents_UserPreferenceChangesEventHandler(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs) If (e.Category = UserPreferenceCategory.Window) Then
Me.Font = SystemFonts.IconTitleFont
End If
End Sub
5.最后,实现FormClosing事件的处理程序,该事件分离UserPreferenceChanged事件
处理程序。
重要事项
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing RemoveHandler erPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf
SystemEvents_UserPreferenceChangesEventHandler)
End Sub
1.编译并运行代码。
手动更改Windows XP 中的字体方案
1.在 Windows 窗体应用程序运行期间,右击 Windows 桌面,然后从快捷菜单中选择“属
性”。
2.在“显示属性”对话框中,单击“外观”选项卡。
3.从“字号”下拉列表框中,选择一个新字号。
您将注意到窗体现在对桌面字体方案的运行时更改做出响应。
当用户在“普通”、“大字体”和“特大字体”之间更改时,窗体将相应地更改字体并缩放。
示例
C#
VB
Imports Microsoft.Win32
Public Class Form1
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
AddHandler erPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf
SystemEvents_UserPreferenceChangesEventHandler)
End Sub
Private Sub SystemEvents_UserPreferenceChangesEventHandler(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs) If (e.Category = UserPreferenceCategory.Window) Then
Me.Font = SystemFonts.IconTitleFont
End If
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing RemoveHandler erPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf
SystemEvents_UserPreferenceChangesEventHandler)
End Sub
End Class
此代码示例中的构造函数包含对InitializeComponent的调用,该组件是您在 Visual Studio 中创建新的 Windows 窗体项目时定义的。
如果通过命令行生成应用程序,请移除此行代码。
请参见
参考
PerformAutoScale
概念
Windows 窗体中的自动缩放。