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

2016-02-19 21:46 45 1 收藏

下面是个超简单的VB中控件大小随窗体大小变化教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - 编程语言 】

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

  在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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  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

来源:http://www.tulaoshi.com/n/20160219/1627139.html

延伸阅读
很多人家长以为怀孕的时候肚子大,那么孩子就肯定也重,那么这样的说法对吗?胎儿的大小到底和什么有关系呢? 胎儿大小和肚子大小有关吗 很多妈妈都会将胎儿的健康与胎儿的重量和大小直接挂钩,因为她们认为胎儿小就是因为胎儿营养不够导致的,胎儿越小,其身体发育就越不正常,其实不然,影响胎儿的大小的因素有很多,胎儿的健康状况只...
标签: PS PS教程
今天遇到有人问怎么在Photoshop中计算面积。开始觉得好笑,但回头想想或许真的有人需要用到这个。 其实Photoshop早就有工具告诉我们选区面积的大小,只是我们平时可能没有留心观察。 Photoshop中矩形选区的面积计算 在Photoshop中打开一张图片。 先来计算一个矩形的面积,在图像上做一个矩形的选区 在信息...
标签: 生长卵泡
成熟卵泡大小 1、一般人的卵泡在20mm以上应该属于成熟了,就可以排出。卵泡多大排卵是因人而宜的,有的长到15mm就排了,有的却要长到25mm。正常情况下成熟的卵泡一到两天的时间内会排出,而排出的卵泡一般可以存活2天的时间。一般会有一个或多个卵泡不等。但每月一般只有一个成熟卵子排出,其他的萎缩了或者被体内吸收了。 2、卵泡发育成...
标签: flash教程
逐步说明: 1)建立程序如图所示。在图层background的第1帧放有“边框”、“判断大小按钮(btn_arrow)”、“文本框背景(txtback)”。 2)在图层background的第六帧处插入一关键帧,并在该帧中添加“YOU WIN”字样,表示您判断全对。 在第七帧处插入一关键帧,并删除“YOU WIN”字样,添加“YOU LOSE”字样,表示您判断...
标签: word
在Word2010中设置SmartArt图形大小   在Word2010文档中,用户可以既通过拖动SmartArt图形边框设置SmartArt图形大小,也可以通过输入具体数值设置大小,本例教程分别介绍如下: 单击选中SmartArt图形,在图形边框的上、下、左、右及四个角上将出现6个控制柄。将鼠标指向这些控制柄,当鼠标指针变成双向箭头形状后拖动鼠标即可改变...

经验教程

611

收藏

74
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部