转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
VB中控件大小随窗体大小变化而变化         ★★★★

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1222 更新时间:2009/4/23 15:02:48
  有时窗体变化后,如改变分辨率后控件大小却不能随之改变。手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件并使其改变大小以适应窗体变化。



  在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

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台