我在Frame容器中放入两个label控件,当窗体大小变化时,frame容器可以随窗体大小发生变化,而这两个label控件却不能随窗体变化,而被Frame遮挡住了。
程序代码如下:
Private m_sngFormOriginalScaleHeight As Single '* 主窗体在设计时使用的垂直方向的比例
Private m_sngFormOriginalScaleWidth As Single '* 主窗体在设计时使用的水平方向的比例
Private m_asngControlOriginalSize() As Single '* 存储控件的4个尺寸的2维动态数组
Private m_intMaxTabIndex As Integer '* 存储控件索引值中的最大值
Private Sub LoadControlSize(ByVal objControlName As Object)
'* 作 用 : 加载控件在设计时的原始尺寸,并存入一个2维数组中,该数组的大小根据控件的多少
'* 来设定大小。窗体中的所有控件在load事件中调用此过程,
'* 可实现“窗体大小变化时控件随之按比例变化”参数初始化
'* 输入参数 : objControlName—各个控件的名称
On Error GoTo PROC_ERR
Dim intCurTabIndex As Integer '* 当前控件的索引号 intCurTabIndex = CInt(objControlName.TabIndex)
'* 如果当前控件的索引号大于前面所有控件索引号,则将2维数组扩展到与当前索引号相同的行数,
'* 并且保留小于索引号行数的所有数组元素的值
If intCurTabIndex >= m_intMaxTabIndex Then
'*根据控件的多少来动态设定2维数组的大小
ReDim Preserve m_asngControlOriginalSize(0 To 3, 0 To intCurTabIndex)
m_intMaxTabIndex = intCurTabIndex
End If
'* 将控件在设计时的4个原始尺寸,根据控件的TabIndex值存入模块级数组相应行中
m_asngControlOriginalSize(0, intCurTabIndex) = objControlName.Top
m_asngControlOriginalSize(1, intCurTabIndex) = objControlName.Left
m_asngControlOriginalSize(2, intCurTabIndex) = objControlName.Height
m_asngControlOriginalSize(3, intCurTabIndex) = objControlName.Width
PROC_EXIT:
Exit Sub
PROC_ERR:
Call ShowError(Me.Name, "Sub_LoadControlSize", Err.Number, Err.Description)
Resume Next
End Sub
Private Sub Form_Load()
'* 作用 : 加载初始化参数
'On Error GoTo PROC_ERR
'********************“窗体大小变化时控件随之按比例变化”参数初始化********************
'* 将设计时的窗体垂直和水平方向比例保存
m_sngFormOriginalScaleHeight = frmMain.ScaleHeight
m_sngFormOriginalScaleWidth = frmMain.ScaleWidth
'* 将设计时控件的原始尺寸例保存
Call LoadControlSize(fraTGDisplay)
Call LoadControlSize(lblTGRadian)
Call LoadControlSize(lblTGDegMinSec)
PROC_EXIT:
Exit Sub
PROC_ERR:
Call ShowError(Me.Name, "frmMain_Load", Err.Number, Err.Description)
Resume Next
End Sub
Private Sub AutoSizeZoom(ByVal objControlName As Object)
'* 作用 : 当窗体尺寸变化时,把加载过的控件尺寸送给控件
'* 窗体中的所有控件在Resize事件中调用此过程,可实现窗体大小变化时控件随之按比例变化
'* 输入参数 : objControlName—各个控件的名称
On Error GoTo PROC_ERR
Dim intCurTabIndex As Integer '* 当前控件的索引号
intCurTabIndex = CInt(objControlName.TabIndex)
'* 把存储在2维数组中的控件尺寸,送回控件
objControlName.Top = m_asngControlOriginalSize(0, intCurTabIndex)
objControlName.Left = m_asngControlOriginalSize(1, intCurTabIndex)
objControlName.Height = m_asngControlOriginalSize(2, intCurTabIndex)
objControlName.Width = m_asngControlOriginalSize(3, intCurTabIndex)
PROC_EXIT:
Exit Sub
PROC_ERR:
Call ShowError(Me.Name, "Sub_AutoSizeZoom", Err.Number, Err.Description)
Resume Next
End Sub
Private Sub Form_Resize()
'* 作用 : 窗体大小变化时控件随之按比例变化
'* 实现此功能需要两个步骤:1)在load事件中初始化参数2)调用AutoSizeZoom过程
On Error GoTo PROC_ERR
Dim aaa As Single
'* 把窗体设计时原始比例加载进来
frmMain.ScaleHeight = m_sngFormOriginalScaleHeight
frmMain.ScaleWidth = m_sngFormOriginalScaleWidth
'* 把控件的原始尺寸送回控件
Call AutoSizeZoom(fraTGDisplay)
Call AutoSizeZoom(lblTGRadian)
Call AutoSizeZoom(lblTGDegMinSec)
PROC_EXIT:
Exit Sub
PROC_ERR:
Call ShowError(Me.Name, "frmMain_Resize", Err.Number, Err.Description)
Resume Next
End Sub
程序代码如下:
Private m_sngFormOriginalScaleHeight As Single '* 主窗体在设计时使用的垂直方向的比例
Private m_sngFormOriginalScaleWidth As Single '* 主窗体在设计时使用的水平方向的比例
Private m_asngControlOriginalSize() As Single '* 存储控件的4个尺寸的2维动态数组
Private m_intMaxTabIndex As Integer '* 存储控件索引值中的最大值
Private Sub LoadControlSize(ByVal objControlName As Object)
'* 作 用 : 加载控件在设计时的原始尺寸,并存入一个2维数组中,该数组的大小根据控件的多少
'* 来设定大小。窗体中的所有控件在load事件中调用此过程,
'* 可实现“窗体大小变化时控件随之按比例变化”参数初始化
'* 输入参数 : objControlName—各个控件的名称
On Error GoTo PROC_ERR
Dim intCurTabIndex As Integer '* 当前控件的索引号 intCurTabIndex = CInt(objControlName.TabIndex)
'* 如果当前控件的索引号大于前面所有控件索引号,则将2维数组扩展到与当前索引号相同的行数,
'* 并且保留小于索引号行数的所有数组元素的值
If intCurTabIndex >= m_intMaxTabIndex Then
'*根据控件的多少来动态设定2维数组的大小
ReDim Preserve m_asngControlOriginalSize(0 To 3, 0 To intCurTabIndex)
m_intMaxTabIndex = intCurTabIndex
End If
'* 将控件在设计时的4个原始尺寸,根据控件的TabIndex值存入模块级数组相应行中
m_asngControlOriginalSize(0, intCurTabIndex) = objControlName.Top
m_asngControlOriginalSize(1, intCurTabIndex) = objControlName.Left
m_asngControlOriginalSize(2, intCurTabIndex) = objControlName.Height
m_asngControlOriginalSize(3, intCurTabIndex) = objControlName.Width
PROC_EXIT:
Exit Sub
PROC_ERR:
Call ShowError(Me.Name, "Sub_LoadControlSize", Err.Number, Err.Description)
Resume Next
End Sub
Private Sub Form_Load()
'* 作用 : 加载初始化参数
'On Error GoTo PROC_ERR
'********************“窗体大小变化时控件随之按比例变化”参数初始化********************
'* 将设计时的窗体垂直和水平方向比例保存
m_sngFormOriginalScaleHeight = frmMain.ScaleHeight
m_sngFormOriginalScaleWidth = frmMain.ScaleWidth
'* 将设计时控件的原始尺寸例保存
Call LoadControlSize(fraTGDisplay)
Call LoadControlSize(lblTGRadian)
Call LoadControlSize(lblTGDegMinSec)
PROC_EXIT:
Exit Sub
PROC_ERR:
Call ShowError(Me.Name, "frmMain_Load", Err.Number, Err.Description)
Resume Next
End Sub
Private Sub AutoSizeZoom(ByVal objControlName As Object)
'* 作用 : 当窗体尺寸变化时,把加载过的控件尺寸送给控件
'* 窗体中的所有控件在Resize事件中调用此过程,可实现窗体大小变化时控件随之按比例变化
'* 输入参数 : objControlName—各个控件的名称
On Error GoTo PROC_ERR
Dim intCurTabIndex As Integer '* 当前控件的索引号
intCurTabIndex = CInt(objControlName.TabIndex)
'* 把存储在2维数组中的控件尺寸,送回控件
objControlName.Top = m_asngControlOriginalSize(0, intCurTabIndex)
objControlName.Left = m_asngControlOriginalSize(1, intCurTabIndex)
objControlName.Height = m_asngControlOriginalSize(2, intCurTabIndex)
objControlName.Width = m_asngControlOriginalSize(3, intCurTabIndex)
PROC_EXIT:
Exit Sub
PROC_ERR:
Call ShowError(Me.Name, "Sub_AutoSizeZoom", Err.Number, Err.Description)
Resume Next
End Sub
Private Sub Form_Resize()
'* 作用 : 窗体大小变化时控件随之按比例变化
'* 实现此功能需要两个步骤:1)在load事件中初始化参数2)调用AutoSizeZoom过程
On Error GoTo PROC_ERR
Dim aaa As Single
'* 把窗体设计时原始比例加载进来
frmMain.ScaleHeight = m_sngFormOriginalScaleHeight
frmMain.ScaleWidth = m_sngFormOriginalScaleWidth
'* 把控件的原始尺寸送回控件
Call AutoSizeZoom(fraTGDisplay)
Call AutoSizeZoom(lblTGRadian)
Call AutoSizeZoom(lblTGDegMinSec)
PROC_EXIT:
Exit Sub
PROC_ERR:
Call ShowError(Me.Name, "frmMain_Resize", Err.Number, Err.Description)
Resume Next
End Sub
Frame容器名称:fraTGDisplay
两个Label名称:lblTGRadian,lblTGDegMinSec
当我把两个label控件从Frame容器中改放到窗体中时,就可以正常缩放了
Private FormOldWidth As Long '保存窗体的原始宽度
Private FormOldHeight As Long '保存窗体的原始高度
'在调用ResizeForm前先调用本函数
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
If TypeOf Obj Is ComboBox Then
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.FontSize & " "
ElseIf TypeOf Obj Is CommandButton Then
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " " & Obj.FontSize & " "
ElseIf TypeOf Obj Is Line Then
Obj.Tag = Obj.X1 & " " & Obj.X2 & " " & Obj.Y1 & " " & Obj.Y2 & " " & Obj.BorderWidth & " "
Else
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " " End If
Next Obj
On Error GoTo 0
End Sub '按比例改变表单内各元件的大小,在调用ReSizeForm前先调用ReSizeInit函数
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 5
'读取控件的原始位置与大小
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
'根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小
Next i If TypeOf Obj Is ComboBox Then
Obj.FontSize = Pos(3) * ScaleY
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX
ElseIf TypeOf Obj Is CommandButton Then
Obj.FontSize = Pos(4) * ScaleY
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
ElseIf TypeOf Obj Is Line Then
Obj.X1 = Pos(0) * ScaleX
Obj.X2 = (Pos(1) - Pos(0)) * ScaleX + Obj.X1
Obj.Y1 = Pos(2) * ScaleY
Obj.Y2 = (Pos(3) - Pos(2)) * ScaleY + Obj.Y1
Obj.BorderWidth = Pos(4) * Sqr(ScaleX * ScaleX + ScaleY * ScaleY)
Else
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
End If
Next Obj
On Error GoTo 0
End SubPrivate Sub Form_Initialize()
Call ResizeInit(Me)
End SubPrivate Sub Form_Resize()
Call ResizeForm(Me)
End Sub
看 看这个例子