|          
有时窗体变化后,如改变分辨率后控件大小却不能随之改变。手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件并使其改变大小以适应窗体变化。
 在Form的Resize事件中调用函数Resize_All就能实现控件自动调整大小,如:
 
 Private Sub Form_Resize()
 Dim H, i As Integer
 On Error Resume Next
 Resize_ALL Me   'Me是窗体名,Form1,Form2等等都可以
 
 End Sub
 
 在模块中添加以下代码:
 
 Public Type ctrObj
 Name As String
 Index As Long
 Parrent As String
 Top As Long
 Left As Long
 Height As Long
 Width As Long
 ScaleHeight As Long
 ScaleWidth As Long
 End Type
 
 Private FormRecord() As ctrObj
 Private ControlRecord() As ctrObj
 Private bRunning As Boolean
 Private MaxForm As Long
 Private MaxControl As Long
 Private Const WM_NCLBUTTONDOWN = &HA1
 Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 Private Declare Function ReleaseCapture Lib "USER32" () As Long
 Function ActualPos(plLeft As Long) As Long
 
 
 If plLeft < 0 Then
 ActualPos = plLeft + 75000
 Else
 ActualPos = plLeft
 End If
 
 End Function
 
 
 Function FindForm(pfrmIn As Form) As Long
 
 Dim i As Long
 FindForm = -1
 
 If MaxForm > 0 Then
 
 For i = 0 To (MaxForm - 1)
 
 If FormRecord(i).Name = pfrmIn.Name Then
 FindForm = i
 Exit Function
 End If
 
 Next i
 
 End If
 
 End Function
 
 
 Function AddForm(pfrmIn As Form) As Long
 
 Dim FormControl As Control
 Dim i As Long
 ReDim Preserve FormRecord(MaxForm + 1)
 
 FormRecord(MaxForm).Name = pfrmIn.Name
 
 FormRecord(MaxForm).Top = pfrmIn.Top
 
 FormRecord(MaxForm).Left = pfrmIn.Left
 
 FormRecord(MaxForm).Height = pfrmIn.Height
 
 FormRecord(MaxForm).Width = pfrmIn.Width
 FormRecord(MaxForm).ScaleHeight = pfrmIn.ScaleHeight
 
 FormRecord(MaxForm).ScaleWidth = pfrmIn.ScaleWidth
 AddForm = MaxForm
 MaxForm = MaxForm + 1
 
 For Each FormControl In pfrmIn
 i = FindControl(FormControl, pfrmIn.Name)
 
 If i < 0 Then
 i = AddControl(FormControl, pfrmIn.Name)
 End If
 
 Next FormControl
 
 End Function
 
 
 Function FindControl(inControl As Control, inName As String) As Long
 
 Dim i As Long
 FindControl = -1
 
 For i = 0 To (MaxControl - 1)
 
 If ControlRecord(i).Parrent = inName Then
 If ControlRecord(i).Name = inControl.Name Then
 On Error Resume Next
 
 If ControlRecord(i).Index = inControl.Index Then
 FindControl = i
 Exit Function
 End If
 
 On Error GoTo 0
 End If
 
 End If
 
 Next i
 
 End Function
 
 
 Function AddControl(inControl As Control, inName As String) As Long
 
 ReDim Preserve ControlRecord(MaxControl + 1)
 On Error Resume Next
 ControlRecord(MaxControl).Name = inControl.Name
 ControlRecord(MaxControl).Index = inControl.Index
 ControlRecord(MaxControl).Parrent = inName
 
 If TypeOf inControl Is Line Then
 ControlRecord(MaxControl).Top = inControl.Y1
 ControlRecord(MaxControl).Left = ActualPos(inControl.X1)
 ControlRecord(MaxControl).Height = inControl.Y2
 ControlRecord(MaxControl).Width = ActualPos(inControl.X2)
 Else
 ControlRecord(MaxControl).Top = inControl.Top
 ControlRecord(MaxControl).Left = ActualPos(inControl.Left)
 ControlRecord(MaxControl).Height = inControl.Height
 ControlRecord(MaxControl).Width = inControl.Width
 End If
 
 inControl.IntegralHeight = False
 On Error GoTo 0
 AddControl = MaxControl
 MaxControl = MaxControl + 1
 End Function
 
 
 Function PerWidth(pfrmIn As Form) As Long
 
 Dim i As Long
 i = FindForm(pfrmIn)
 
 If i < 0 Then
 i = AddForm(pfrmIn)
 End If
 
 PerWidth = (pfrmIn.ScaleWidth * 100) \ FormRecord(i).ScaleWidth
 End Function
 
 
 Function PerHeight(pfrmIn As Form) As Double
 
 Dim i As Long
 i = FindForm(pfrmIn)
 
 If i < 0 Then
 i = AddForm(pfrmIn)
 End If
 
 PerHeight = (pfrmIn.ScaleHeight * 100) \ FormRecord(i).ScaleHeight
 End Function
 
 
 Public Sub ResizeControl(inControl As Control, pfrmIn As Form)
 
 On Error Resume Next
 Dim i As Long
 Dim widthfactor As Single, heightfactor As Single
 Dim minFactor As Single
 Dim yRatio, xRatio, lTop, lLeft, lWidth, lHeight As Long
 yRatio = PerHeight(pfrmIn)
 xRatio = PerWidth(pfrmIn)
 i = FindControl(inControl, pfrmIn.Name)
 
 If inControl.Left < 0 Then
 lLeft = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)
 Else
 lLeft = CLng((ControlRecord(i).Left * xRatio) \ 100)
 End If
 
 lTop = CLng((ControlRecord(i).Top * yRatio) \ 100)
 lWidth = CLng((ControlRecord(i).Width * xRatio) \ 100)
 lHeight = CLng((ControlRecord(i).Height * yRatio) \ 100)
 If TypeOf inControl Is Line Then
 
 If inControl.X1 < 0 Then
 inControl.X1 = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)
 Else
 inControl.X1 = CLng((ControlRecord(i).Left * xRatio) \ 100)
 End If
 
 inControl.Y1 = CLng((ControlRecord(i).Top * yRatio) \ 100)
 
 If inControl.X2 < 0 Then
 inControl.X2 = CLng(((ControlRecord(i).Width * xRatio) \ 100) - 75000)
 Else
 inControl.X2 = CLng((ControlRecord(i).Width * xRatio) \ 100)
 End If
 
 inControl.Y2 = CLng((ControlRecord(i).Height * yRatio) \ 100)
 Else
 inControl.Move lLeft, lTop, lWidth, lHeight
 inControl.Move lLeft, lTop, lWidth
 inControl.Move lLeft, lTop
 End If
 
 End Sub
 
 Public Sub ResizeForm(pfrmIn As Form)
 
 Dim FormControl As Control
 Dim isVisible As Boolean
 Dim StartX, StartY, MaxX, MaxY As Long
 Dim bNew As Boolean
 
 If Not bRunning Then
 bRunning = True
 
 If FindForm(pfrmIn) < 0 Then
 bNew = True
 Else
 bNew = False
 End If
 
 
 If pfrmIn.Top < 30000 Then
 isVisible = pfrmIn.Visible
 On Error Resume Next
 
 If Not pfrmIn.MDIChild Then
 On Error GoTo 0
 '     ' pfrmIn.Visible = False
 Else
 
 If bNew Then
 StartY = pfrmIn.Height
 StartX = pfrmIn.Width
 On Error Resume Next
 
 For Each FormControl In pfrmIn
 
 If FormControl.Left + FormControl.Width + 200 > MaxX Then
 MaxX = FormControl.Left + FormControl.Width + 200
 End If
 
 
 If FormControl.Top + FormControl.Height + 500 > MaxY Then
 MaxY = FormControl.Top + FormControl.Height + 500
 End If
 
 
 If FormControl.X1 + 200 > MaxX Then
 MaxX = FormControl.X1 + 200
 End If
 
 
 If FormControl.Y1 + 500 > MaxY Then
 MaxY = FormControl.Y1 + 500
 End If
 
 If FormControl.X2 + 200 > MaxX Then
 MaxX = FormControl.X2 + 200
 End If
 
 
 If FormControl.Y2 + 500 > MaxY Then
 MaxY = FormControl.Y2 + 500
 End If
 
 Next FormControl
 
 On Error GoTo 0
 pfrmIn.Height = MaxY
 pfrmIn.Width = MaxX
 End If
 
 On Error GoTo 0
 End If
 
 
 For Each FormControl In pfrmIn
 ResizeControl FormControl, pfrmIn
 Next FormControl
 
 On Error Resume Next
 
 If Not pfrmIn.MDIChild Then
 On Error GoTo 0
 pfrmIn.Visible = isVisible
 Else
 
 If bNew Then
 pfrmIn.Height = StartY
 pfrmIn.Width = StartX
 
 For Each FormControl In pfrmIn
 ResizeControl FormControl, pfrmIn
 Next FormControl
 
 End If
 
 End If
 
 On Error GoTo 0
 End If
 
 bRunning = False
 End If
 
 End Sub
 
 
 Public Sub SaveFormPosition(pfrmIn As Form)
 
 Dim i As Long
 
 If MaxForm > 0 Then
 
 For i = 0 To (MaxForm - 1)
 
 If FormRecord(i).Name = pfrmIn.Name Then
 
 FormRecord(i).Top = pfrmIn.Top
 
 FormRecord(i).Left = pfrmIn.Left
 
 FormRecord(i).Height = pfrmIn.Height
 
 FormRecord(i).Width = pfrmIn.Width
 Exit Sub
 End If
 
 Next i
 
 AddForm (pfrmIn)
 End If
 
 End Sub
 
 
 Public Sub RestoreFormPosition(pfrmIn As Form)
 
 Dim i As Long
 If MaxForm > 0 Then
 
 For i = 0 To (MaxForm - 1)
 
 If FormRecord(i).Name = pfrmIn.Name Then
 
 If FormRecord(i).Top < 0 Then
 pfrmIn.WindowState = 2
 ElseIf FormRecord(i).Top < 30000 Then
 pfrmIn.WindowState = 0
 pfrmIn.Move FormRecord(i).Left, FormRecord(i).Top, FormRecord(i).Width, FormRecord(i).Height
 Else
 pfrmIn.WindowState = 1
 End If
 
 Exit Sub
 End If
 
 Next i
 
 End If
 
 End Sub
 Public Sub Resize_ALL(Form_Name As Form)
 
 Dim OBJ As Object
 For Each OBJ In Form_Name
 ResizeControl OBJ, Form_Name
 Next OBJ
 
 
 
 End Sub
 
 Public Sub DragForm(frm As Form)
 
 On Local Error Resume Next
 Call ReleaseCapture
 Call SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0)
 
 End Sub
 |