视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
VB中控件大小随窗体大小变化而变化
2025-09-25 17:45:57 责编:小OO
文档
窗体底端

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

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

  在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

下载本文
显示全文
专题