如何在调整窗体大小时自动调整窗体上的控件大小或重新定位控件?
How to automatically resize or reposition controls on a form when the form is resized?
所以我正在努力使我的表格适合所有显示器。有些具有不同的显示分辨率和比例。
我可以调整表单的大小以适应显示,但其内容的所有属性都不会调整到新的大小。
我想要的是,如果窗体缩放以适合显示,窗体上的控件也应该调整。具体来说,每个控件上的 Left
、Top
、Width
、Height
等属性。
尺寸可以缩小或放大。
可以(大部分)以编程方式遍历表单上的所有控件,而不必显式调整每个控件。您可能必须为某些类型的控件(例如我在示例中添加的计时器)添加一些例外,但通常您可以使用类似:
Option Explicit
Private Type ControlInfo_type
Left As Single
Top As Single
Width As Single
Height As Single
FontSize As Single
End Type
Dim ControlInfos() As ControlInfo_type
Private Sub Form_Load()
Dim ThisControl As Control
ReDim Preserve ControlInfos(0 To 0)
ControlInfos(0).Width = Me.Width
ControlInfos(0).Height = Me.Height
For Each ThisControl In Me.Controls
ReDim Preserve ControlInfos(0 To UBound(ControlInfos) + 1)
On Error Resume Next ' hack to bypass controls with no size or position properties
With ControlInfos(UBound(ControlInfos))
.Left = ThisControl.Left
.Top = ThisControl.Top
.Width = ThisControl.Width
.Height = ThisControl.Height
.FontSize = ThisControl.FontSize
End With
On Error GoTo 0
Next
End Sub
Private Sub Form_Resize()
Dim ThisControl As Control, HorizRatio As Single, VertRatio As Single, Iter As Integer
If Me.WindowState = vbMinimized Then Exit Sub
HorizRatio = Me.Width / ControlInfos(0).Width
VertRatio = Me.Height / ControlInfos(0).Height
Iter = 0
For Each ThisControl In Me.Controls
Iter = Iter + 1
On Error Resume Next ' hack to bypass controls
With ThisControl
.Left = ControlInfos(Iter).Left * HorizRatio
.Top = ControlInfos(Iter).Top * VertRatio
.Width = ControlInfos(Iter).Width * HorizRatio
.Height = ControlInfos(Iter).Height * VertRatio
.FontSize = ControlInfos(Iter).FontSize * HorizRatio
End With
On Error GoTo 0
Next
End Sub
我使用带有命令按钮、框架、计时器和文本框的默认表单对此进行了测试,它似乎工作正常。您可能想要调整外观的最小和最大尺寸限制,而我对字体的处理非常粗糙;这也可以优化。但也许这可以作为一个起点。
此代码取决于控件每次都以相同的方式迭代,这可能会中断。解决这个问题的一种方法是使用 Collection 或其他以控件名称作为键的数据结构;在 .Resize 事件中迭代时,将按名称查找每个控件。如果任何控件本身就是数组,则需要额外的结构,如果控件是动态加载或卸载的,则更多。
所以我正在努力使我的表格适合所有显示器。有些具有不同的显示分辨率和比例。
我可以调整表单的大小以适应显示,但其内容的所有属性都不会调整到新的大小。
我想要的是,如果窗体缩放以适合显示,窗体上的控件也应该调整。具体来说,每个控件上的 Left
、Top
、Width
、Height
等属性。
尺寸可以缩小或放大。
可以(大部分)以编程方式遍历表单上的所有控件,而不必显式调整每个控件。您可能必须为某些类型的控件(例如我在示例中添加的计时器)添加一些例外,但通常您可以使用类似:
Option Explicit
Private Type ControlInfo_type
Left As Single
Top As Single
Width As Single
Height As Single
FontSize As Single
End Type
Dim ControlInfos() As ControlInfo_type
Private Sub Form_Load()
Dim ThisControl As Control
ReDim Preserve ControlInfos(0 To 0)
ControlInfos(0).Width = Me.Width
ControlInfos(0).Height = Me.Height
For Each ThisControl In Me.Controls
ReDim Preserve ControlInfos(0 To UBound(ControlInfos) + 1)
On Error Resume Next ' hack to bypass controls with no size or position properties
With ControlInfos(UBound(ControlInfos))
.Left = ThisControl.Left
.Top = ThisControl.Top
.Width = ThisControl.Width
.Height = ThisControl.Height
.FontSize = ThisControl.FontSize
End With
On Error GoTo 0
Next
End Sub
Private Sub Form_Resize()
Dim ThisControl As Control, HorizRatio As Single, VertRatio As Single, Iter As Integer
If Me.WindowState = vbMinimized Then Exit Sub
HorizRatio = Me.Width / ControlInfos(0).Width
VertRatio = Me.Height / ControlInfos(0).Height
Iter = 0
For Each ThisControl In Me.Controls
Iter = Iter + 1
On Error Resume Next ' hack to bypass controls
With ThisControl
.Left = ControlInfos(Iter).Left * HorizRatio
.Top = ControlInfos(Iter).Top * VertRatio
.Width = ControlInfos(Iter).Width * HorizRatio
.Height = ControlInfos(Iter).Height * VertRatio
.FontSize = ControlInfos(Iter).FontSize * HorizRatio
End With
On Error GoTo 0
Next
End Sub
我使用带有命令按钮、框架、计时器和文本框的默认表单对此进行了测试,它似乎工作正常。您可能想要调整外观的最小和最大尺寸限制,而我对字体的处理非常粗糙;这也可以优化。但也许这可以作为一个起点。
此代码取决于控件每次都以相同的方式迭代,这可能会中断。解决这个问题的一种方法是使用 Collection 或其他以控件名称作为键的数据结构;在 .Resize 事件中迭代时,将按名称查找每个控件。如果任何控件本身就是数组,则需要额外的结构,如果控件是动态加载或卸载的,则更多。