有时窗体变化后,如改变分辨率后控件大小却不能随之改变。手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件并使其改变大小以适应窗体变化。 
在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
   
 
  |