众香之主 发表于 2007-5-27 17:00:17

窗体控件大小随窗体大小变化而变化

作者:未知 文章来源:本站整理 点击数: 6 更新时间:2007-2-19 13:48:12有时窗体变化后,如改变分辨率后控件大小却不能随之改变。手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件并使其改变大小以适应窗体变化。
在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
                                                 &acute;   &acute; 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

玩世不恭 发表于 2007-5-27 17:27:01

哟````高手来到D波````
页: [1]
查看完整版本: 窗体控件大小随窗体大小变化而变化