找回密码
 入驻
搜索
查看: 63541|回复: 1

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

[复制链接]
发表于 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波````
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 入驻

本版积分规则

QQ|Archiver|手机版|小黑屋|思明论坛

GMT+8, 2024-11-16 20:22 , Processed in 0.059195 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表