当前位置:学海荡舟 -> 电脑乐园 -> 自动改变控件大小




  趣 味 程 序
--趣味程序源码注解--自动改变控件大小--

  由于我们设计窗体时,安排的各个控件的大小和位置是固定的,如果在程序运行过程中窗体大小发生了变化,就会造成控件大小与窗体大小不成比例。怎样简单快捷的解决这个问题呢?本例给出了一个不错的方法。

  为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:


(源程序下载)

  先来看看与控件和对象的大小、位置相关的几个属性,已经列表如下:

属性 意义
ScaleWidth、ScaleHeight 用 ScaleLeft、ScaleTop、ScaleHeight 和 ScaleWidth 来完成基于对象内部尺寸的操作,如绘出或移动包含在该对象中的对象。
ScaleLeft、ScaleTop
Left、Top 用 Left、Top、Height 和 Width 属性来完成基于对象外部维数的操作,如移动或改变尺寸。对于窗体内放置的控件,这几个属性代表控件相对于窗体的位置;而对于窗体应用这几个属性则表示窗体相对于屏幕的位置。
Width、Height

  程序实现的基本思路是在窗体大小改变前取得窗体的ScaleWidth、ScaleHeight以及窗体内各个控件的Left、Top、Width、Height属性,并把它们保存起来。当窗体的大小被改变时,用窗体的新ScaleWidth、ScaleHeight与改变前的值相比,得到一个缩放比例,然后把这个比例与控件的Left、Top、Width、Height属性的乘积作为新的控件位置和大小,重画这些控件。下面是实现的步骤:

   1、得到原有窗体ScaleWidth、ScaleHeight属性:
   FormOldWidth = FormName.ScaleWidth
   FormOldHeight = FormName.ScaleHeight
   2、取得各个控件的Left、Top、Width、Height属性并把它们存放在控件的Tag属性中:
   Dim Obj As Control   'Control是一个对象,表示所有 Visual Basic 内部控件的类名
   For Each Obj In FormName
   'Tag返回或设置一个表达式用来存储程序中需要的额外数据。
   Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "
   Next Obj
   3、当窗体大小改变时计算缩放比例:
   '保存窗体宽度缩放比例
   ScaleX = FormName.ScaleWidth / FormOldWidth
   '保存窗体高度缩放比例
   ScaleY = FormName.ScaleHeight / FormOldHeight
   4、读取控件的原始位置与大小,并根据缩放比例重新安置控件:
   For Each Obj In FormName StartPos = 1
    For i = 0 To 4
     TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare)
     If TempPos > 0 Then
       Pos(i) = Mid(Obj.Tag, StartPos, TempPos - StartPos)
       StartPos = TempPos + 1
     Else Pos(i) = 0
     End If
     Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
    Next i
   Next Obj

  好了这样我们就不必担心窗体内的控件大小位置不成比例了,由于程序可以自动改变所有控件的大小,只要是窗体内的控件,大小都随之而变化,可谓“一劳永逸”的好办法。

相关链接:   看实例学VB