正文

VB中控件大小随窗体大小变2005-10-06 12:38:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/iamben250/5776.html

分享到:

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

阅读(2779) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册