参考 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 If TypeOf Obj Is ComboBox Then Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.FontSize & " " ElseIf TypeOf Obj Is CommandButton Then Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " " & Obj.FontSize & " " ElseIf TypeOf Obj Is Line Then Obj.Tag = Obj.X1 & " " & Obj.X2 & " " & Obj.Y1 & " " & Obj.Y2 & " " & Obj.BorderWidth & " " Else Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " " End If 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 5 '读取控件的原始位置与大小 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 '根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小 Next i If TypeOf Obj Is ComboBox Then Obj.FontSize = Pos(3) * ScaleY Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX ElseIf TypeOf Obj Is CommandButton Then Obj.FontSize = Pos(4) * ScaleY Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY ElseIf TypeOf Obj Is Line Then Obj.X1 = Pos(0) * ScaleX Obj.X2 = (Pos(1) - Pos(0)) * ScaleX + Obj.X1 Obj.Y1 = Pos(2) * ScaleY Obj.Y2 = (Pos(3) - Pos(2)) * ScaleY + Obj.Y1 Obj.BorderWidth = Pos(4) * Sqr(ScaleX * ScaleX + ScaleY * ScaleY) Else Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY End If Next Obj On Error GoTo 0 End SubPrivate Sub Form_Initialize() Call ResizeInit(Me) End SubPrivate Sub Form_Resize() Call ResizeForm(Me) End Sub
本帖最后由 bcrun 于 2010-12-10 08:46:37 编辑
API函数MoveWindow可以改变窗体的大小。控件也可。
Option Explicit Dim K_X As Double Dim K_Y As Double' 'Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, _ ' ByVal x As Long, _ ' ByVal y As Long, _ ' ByVal nWidth As Long, _ ' ByVal nHeight As Long, _ ' ByVal bRepaint As Long) As Long Private Sub Form_Load() With Me .Width = 4000 .Height = 3000 End With With Command1 .Width = 1000 .Height = 800 End With K_X = Command1.Width / Me.Width K_Y = Command1.Height / Me.Height End SubPrivate Sub Form_Resize() Dim lngW As Long Dim lngH As Long
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
If TypeOf Obj Is ComboBox Then
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.FontSize & " "
ElseIf TypeOf Obj Is CommandButton Then
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " " & Obj.FontSize & " "
ElseIf TypeOf Obj Is Line Then
Obj.Tag = Obj.X1 & " " & Obj.X2 & " " & Obj.Y1 & " " & Obj.Y2 & " " & Obj.BorderWidth & " "
Else
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " " End If
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 5
'读取控件的原始位置与大小
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
'根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小
Next i If TypeOf Obj Is ComboBox Then
Obj.FontSize = Pos(3) * ScaleY
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX
ElseIf TypeOf Obj Is CommandButton Then
Obj.FontSize = Pos(4) * ScaleY
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
ElseIf TypeOf Obj Is Line Then
Obj.X1 = Pos(0) * ScaleX
Obj.X2 = (Pos(1) - Pos(0)) * ScaleX + Obj.X1
Obj.Y1 = Pos(2) * ScaleY
Obj.Y2 = (Pos(3) - Pos(2)) * ScaleY + Obj.Y1
Obj.BorderWidth = Pos(4) * Sqr(ScaleX * ScaleX + ScaleY * ScaleY)
Else
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
End If
Next Obj
On Error GoTo 0
End SubPrivate Sub Form_Initialize()
Call ResizeInit(Me)
End SubPrivate Sub Form_Resize()
Call ResizeForm(Me)
End Sub
Option Explicit
Dim K_X As Double
Dim K_Y As Double'
'Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, _
' ByVal x As Long, _
' ByVal y As Long, _
' ByVal nWidth As Long, _
' ByVal nHeight As Long, _
' ByVal bRepaint As Long) As Long
Private Sub Form_Load()
With Me
.Width = 4000
.Height = 3000
End With
With Command1
.Width = 1000
.Height = 800
End With
K_X = Command1.Width / Me.Width
K_Y = Command1.Height / Me.Height
End SubPrivate Sub Form_Resize()
Dim lngW As Long
Dim lngH As Long
Command1.Width = Me.Width * K_X
Command1.Height = Me.Height * K_Y
End Sub