在VB中如何动态改变控件大小 当窗体大小改变时,如何动态的改变控件的大小是许多VB 程序员头痛的事。有的人设置窗体Resizable 但却不改变控件的大小;有的人则根据控件的绝对位置与窗口大小相加减的办法来重新定位控件与改变大小,这种办法比较繁琐,且不可重用;当然也有人则限定窗口干脆不让改变。有没有一种简便易行的办法?答案是肯定的,下面给出一个一劳永逸的办法, 源程序如下: Option Explicit Private FormOldWidth As Long '保存窗体的原始宽度 Private FormOldHeight As Long '保存窗体的原始高度 '在调用ResizeForm前先调用本函数 Public Sub ResizeInit(FormName As Form) Dim Obj As Control FormOldWidth = FormName.ScaleWidth FormOldHeight = FormName.ScaleHeight On Error Resume Next For Each Obj In FormName Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & _ " " & Obj.Height & " " Next Obj On Error GoTo 0 End Sub '按比例改变表单内各元件的大小,在调用ReSizeForm前先调用ReSizeInit函数 Public Sub ResizeForm(FormName As Form) Dim Pos(4) As Double Dim i As Long, TempPos As Long, StartPos As Long Dim Obj As Control Dim ScaleX As Double, ScaleY As Double ScaleX = FormName.ScaleWidth / FormOldWidth '保存窗体宽度缩放比例 ScaleY = FormName.ScaleHeight / FormOldHeight '保存窗体高度缩放比例 On Error Resume Next For Each Obj In FormName StartPos = 1 For i = 0 To 4 '读取控件的原始位置与大小 TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare) If TempPos > 0 Then Pos(i) = Mid(Obj.Tag, StartPos, TempPos - StartPos) StartPos = TempPos + 1 Else Pos(i) = 0 End If '根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小 Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, _ Pos(2) * ScaleX, Pos(3) * ScaleY Next i Next Obj On Error GoTo 0 End Sub Private Sub Form_Load() Call ResizeInit(Me) '在程序装入时必须加入 End Sub Private Sub Form_Resize() Call ResizeForm(Me) '确保窗体改变时控件随之改变 End Sub 本例中给出了二个函数: ResizeInit 和 ResizeForm, 在调用 ResizeForm 之前必须先调用 ResizeInit。你可将 FormOldWidth、FormOldHeight 变量与 ResizeInit、ResizeForm 函数封装到类, 参数 FormName 为要改变大小的窗体名。另外在函数中使用了 On Error Resume Next 语句是为了确保没有 width, height, Tag 等属性,程序也能正常執行。你可以将整篇文章拷到窗体代码段里,然后在窗体里加入任意的控件即可进行测试。
Private FormOldWidth As Long '保存窗体的原始宽度
Private FormOldHeight As Long '保存窗体的原始高度 '在调用ResizeForm前先调用本函数
Public Sub ResizeInit(FormName As Form)
Dim Obj As Control
FormOldWidth = FormName.ScaleWidth
FormOldHeight = FormName.ScaleHeight
On Error Resume Next
For Each Obj In FormName
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & _
" " & Obj.Height & " "
Next Obj
On Error GoTo 0
End Sub '按比例改变表单内各元件的大小,在调用ReSizeForm前先调用ReSizeInit函数
Public Sub ResizeForm(FormName As Form)
Dim Pos(4) As Double
Dim i As Long, TempPos As Long, StartPos As Long
Dim Obj As Control
Dim ScaleX As Double, ScaleY As Double ScaleX = FormName.ScaleWidth / FormOldWidth
'保存窗体宽度缩放比例
ScaleY = FormName.ScaleHeight / FormOldHeight
'保存窗体高度缩放比例
On Error Resume Next
For Each Obj In FormName
StartPos = 1
For i = 0 To 4
'读取控件的原始位置与大小
TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare)
If TempPos > 0 Then
Pos(i) = Mid(Obj.Tag, StartPos, TempPos - StartPos)
StartPos = TempPos + 1
Else
Pos(i) = 0
End If
'根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, _
Pos(2) * ScaleX, Pos(3) * ScaleY
Next i
Next Obj
On Error GoTo 0
End Sub Private Sub Form_Load()
Call ResizeInit(Me) '在程序装入时必须加入
End Sub Private Sub Form_Resize()
Call ResizeForm(Me)
'确保窗体改变时控件随之改变
End Sub 本例中给出了二个函数: ResizeInit 和 ResizeForm, 在调用 ResizeForm 之前必须先调用 ResizeInit。你可将 FormOldWidth、FormOldHeight 变量与 ResizeInit、ResizeForm 函数封装到类, 参数 FormName 为要改变大小的窗体名。另外在函数中使用了 On Error Resume Next 语句是为了确保没有 width, height, Tag 等属性,程序也能正常執行。你可以将整篇文章拷到窗体代码段里,然后在窗体里加入任意的控件即可进行测试。