在敲学生信息管理系统的时候,就想到了窗体最大化后,控件随窗体改变而相应比例改变的优化问题,但是没去实现,后在优化机房的时候,将以前积累的代码重新拿出来试了试:
在模块中声明公用函数:
<span style="font-size:18px;"><span style="font-size:18px;">Option Explicit Private FormOldWidth As Long '保存窗体的原始宽度 Private FormOldHeight As Long '保存窗体的原始高度 Public Sub ResizeInit(FormName As Form) Dim Obj As Control FormOldWidth = FormName.ScaleWidth FormOldHeight = FormName.ScaleHeight On Error Resume Next For Each Obj In FormName Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " " Next Obj On Error GoTo 0 End Sub Public Sub ResizeForm(FormName As Form) Dim Pos(4) As Double Dim i As Long, TempPos As Long, StartPos As Long Dim Obj As Control Dim ScaleX As Double, ScaleY As Double ScaleX = FormName.ScaleWidth / FormOldWidth ScaleY = FormName.ScaleHeight / FormOldHeight On Error Resume Next 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 On Error GoTo 0 End Sub</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">Private Sub Form_Resize() Call ResizeForm(Me) '确保窗体改变时控件随之改变 End Sub Private Sub Form_Load() Call ResizeInit(Me) '在程序装入时加入 end sub</span></span>
令人觉得奇怪的是:新建的工程里就能完美的实现,但是放到机房收费系统就会报错:
后想起也许是因为机房收费系统中MDI窗体使用了PictureBox控件,导致需要用到SetParent函数才能显示子窗体的缘故,如果不在Form的Load事件中给窗体设定大小(Me.Height =自定义高度值;Me.Width = 自定义宽度值),运行的时候子窗体只有“头”会漏一点,除非设置BorderStyle属性为1来固定窗体大小,但是属性设置了,就没有最大化和最小化功能了。
由于这个功能在优化子窗体的时候没有太多必要,所以那时我就放弃了,直接将属性设为1。如今机房优化已经完成,回过头来新建了一个工程用来实验,实验成功!发现不是因为自己在窗体中限制了自定义宽度和高度的原因,也不是因为将其(Me.Height =自定义高度值;Me.Width = 自定义宽度值)写在了Form_Load事件中Call ResizeInit(Me) 这句代码前后的原因——这是我曾一度以为的错误原因。
可是用机房收费系统来试验代码依旧会报错,哪怕属性设置都没有错(如下)
以下代码是写在模块里边的:
我很是不解,为什么新建工程就不会出现这样的问题呢?所以,此博文的目的并不在于分享经验,而是请求指点~~~