Dim FrmW As Single '存放改变前的窗体的宽度
Dim frmH As Single '存放改变前的窗体的高度Private Sub Form_Load()
If WindowState <> vbMinimized Then
FrmW = Me.Width
frmH = Me.Height
'上面两句是初始化模块变量
End If
End SubPrivate Sub Form_Resize()
If FrmW = 0 Or frmH = 0 Then Exit SubDim MyCon As Control
Dim sig1 As Single, sig2 As Single
sig1 = Me.Width / FrmW
sig2 = Me.Height / frmH
For Each MyCon In Me.Controls
If TypeOf MyCon Is Label Or _
TypeOf MyCon Is CommandButton Or _
TypeOf MyCon Is ListView Or _
TypeOf MyCon Is TextBox Or _
TypeOf MyCon Is ComboBox Or _
TypeOf MyCon Is ListBox Then
With MyCon
.Left = Int(.Left * sig1)
.Top = Int(.Top * sig2)
.Width = Int(.Width * sig1)
.Height = Int(.Height * sig2)
End With
End If
Next MyConFrmW = Me.Width
frmH = Me.HeightEnd Sub
Dim frmH As Single '存放改变前的窗体的高度Private Sub Form_Load()
If WindowState <> vbMinimized Then
FrmW = Me.Width
frmH = Me.Height
'上面两句是初始化模块变量
End If
End SubPrivate Sub Form_Resize()
If FrmW = 0 Or frmH = 0 Then Exit SubDim MyCon As Control
Dim sig1 As Single, sig2 As Single
sig1 = Me.Width / FrmW
sig2 = Me.Height / frmH
For Each MyCon In Me.Controls
If TypeOf MyCon Is Label Or _
TypeOf MyCon Is CommandButton Or _
TypeOf MyCon Is ListView Or _
TypeOf MyCon Is TextBox Or _
TypeOf MyCon Is ComboBox Or _
TypeOf MyCon Is ListBox Then
With MyCon
.Left = Int(.Left * sig1)
.Top = Int(.Top * sig2)
.Width = Int(.Width * sig1)
.Height = Int(.Height * sig2)
End With
End If
Next MyConFrmW = Me.Width
frmH = Me.HeightEnd Sub
另外通过简单的乘法来确定控件的位置是做不到的,因为有起始位置的因数。
如果一定要做到,则思路如下:
1 在formload事件里记录每个控件的基本信息(包括起始位置和大小),最好用
多维数组实现(可以使用自定义类型)
2 在resize事件中根据变化和前面保存的基本信息做相应的位置和大小处理.
'原作者:邓勇
'收集整理:小聪明 [email protected]
'欢迎访问小聪明的主页VB版: http://coolzm.533.net
'******************************************************
'功能::窗体大小改变时窗体内的控件大小也随之动态改变
'使用方法:
'在相应的窗体程序中加入如下语句:
'---------------------------------------------------
'Private Sub Form_Load()
' Call ResizeInit(Me) '在程序装入时必须加入
'End Sub'Private Sub Form_Resize()
' Call ResizeForm(Me) '确保窗体改变时控件随之改变
'End Sub
'---------------------------------------------------
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
方法是对于每个控件,预先计算出他们各自的width,height,left,top
和附属的form的width或者height的比例,然后在form_resize中,根据新的form
的width或者height,让他们乘于各个控件的比例系数,就可以达到不错的效果
Private kx_flex1 As Double 'MSflex1控件_x 与 Form1_x 的比例
Private ky_flex1 As Double 'MSflex1控件_y 与 Form1_y 的比例
Private kx_flex2 As Double
Private ky_flex2 As Double
Private kx_flex3 As Double
Private ky_flex3 As DoublePrivate kx_tab As Double '分项页控件_x 与 Form1_x 的比例
Private ky_tab As Double '分项页控件_y 与 Form1_y 的比例
Private kx_list As Double 'List控件_x 与 Form1_x 的比例
Private ky_list As Double 'List控件_y 与 Form1_y 的比例
Private kx_sta As Double '状态栏控件_x 与 Form1_x 的比例
Private ky_sta As Double '状态栏控件_y 与 Form1_y 的比例Private kl_flex1 As Double 'MSflex1控件_left 与 Form1_x 的比例
Private kt_flex1 As Double 'MSflex1控件_top 与 Form1_y 的比例
Private kl_flex2 As Double
Private kt_flex2 As Double
Private kl_flex3 As Double
Private kt_flex3 As DoublePrivate kl_tab As Double '分项页控件_left 与 Form1_x 的比例
Private kt_tab As Double '分项页控件_top 与 Form1_y 的比例
Private kl_list As Double 'List控件_left 与 Form1_x 的比例
Private kt_list As Double 'List控件_top 与 Form1_y 的比例
Private kl_sta As Double '状态栏控件_left 与 Form1_x 的比例
Private kt_sta As Double '状态栏控件_top 与 Form1_y 的比例Public Sub change_size()
kx_flex1 = 0.445833333333333
ky_flex1 = 0.729090909090909
kx_flex2 = 0.445833333333333
ky_flex2 = 0.729090909090909
kx_flex3 = 0.445833333333333
ky_flex3 = 0.729090909090909
kx_tab = 0.968055555555556
ky_tab = 0.830909090909091
kx_list = 0.479166666666667
ky_list = 0.727272727272727
kx_sta = 0.988888888888889
ky_sta = 4.54545454545455E-02
kl_flex1 = 3.33333333333333E-02
kt_flex1 = 0.101818181818182
kl_flex2 = 3.33333333333333E-02
kt_flex2 = 0.101818181818182
kl_flex3 = 3.33333333333333E-02
kt_flex3 = 0.101818181818182
kl_tab = 1.11111111111111E-02
kt_tab = 5.81818181818182E-02
kl_list = 0.488888888888889
kt_list = 0.101818181818182
kl_sta = 0
kt_sta = 0.905454545454545Form1.MSFlexGrid1.Width = Form1.Width * kx_flex1
Form1.MSFlexGrid2.Width = Form1.Width * kx_flex2
Form1.MSFlexGrid3.Width = Form1.Width * kx_flex3Form1.TabStrip1.Width = Form1.Width * kx_tab
Form1.List1.Width = Form1.Width * kx_list
Form1.StatusBar1.Panels(1).Width = Form1.Width * kx_sta
Form1.MSFlexGrid1.Height = Form1.Height * ky_flex1
Form1.MSFlexGrid2.Height = Form1.Height * ky_flex2
Form1.MSFlexGrid3.Height = Form1.Height * ky_flex3Form1.TabStrip1.Height = Form1.Height * ky_tab
Form1.List1.Height = Form1.Height * ky_list
Form1.StatusBar1.Height = Form1.Height * ky_staForm1.MSFlexGrid1.Left = Form1.Width * kl_flex1
Form1.MSFlexGrid2.Left = Form1.Width * kl_flex2
Form1.MSFlexGrid3.Left = Form1.Width * kl_flex3Form1.TabStrip1.Left = Form1.Width * kl_tab
Form1.List1.Left = Form1.Width * kl_list
'StatusBar1.Panels(1).Left = Form1.Width * kl_sta
Form1.MSFlexGrid1.Top = Form1.Height * kt_flex1
Form1.MSFlexGrid2.Top = Form1.Height * kt_flex2
Form1.MSFlexGrid3.Top = Form1.Height * kt_flex3Form1.TabStrip1.Top = Form1.Height * kt_tab
Form1.List1.Top = Form1.Height * kt_list
Form1.StatusBar1.Top = Form1.Height * kt_sta
End Sub
这个其实很好办,在form.load事件中计算一遍就知道了
另外,还要预先计算下列两项:1 form.width和当前screen.width的比例
2 form.width和当前screen.height的比例例如第一项计算为0.7401042
第二项为0.7434896 Form1.Width = 0.7401042 * Screen.Width '根据不同分辨率保证窗体大小与屏幕大小的比例
Form1.Height = 0.7434896 * Screen.Height这样窗体还可以根据不同的分辨率自动调整窗体大小
'保证窗体大小变化的时候各控件的大小和位置不难看
Text1.Width = Me.ScaleWidth - 480
Command1.Left = Text1.Width + Text1.Left - Command1.Width - 30
TreeView1.Top = Text1.Top + Text1.Height + 300
DataGrid1.Top = Text1.Top + Text1.Height + 300
TreeView1.Height = Me.ScaleHeight - Text1.Top - Text1.Height - 600
TreeView1.Width = Me.ScaleWidth * 0.3
DataGrid1.Height = Me.ScaleHeight - Text1.Top - Text1.Height - 600
DataGrid1.Left = TreeView1.Left + TreeView1.Width + 300
DataGrid1.Width = Me.Width - TreeView1.Left - Me.ScaleWidth * 0.3 - 690
End Sub