我在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

解决方案 »

  1.   

    补充说明
    Frame容器名称:fraTGDisplay
    两个Label名称:lblTGRadian,lblTGDegMinSec
    当我把两个label控件从Frame容器中改放到窗体中时,就可以正常缩放了
      

  2.   

    你这搞的太复杂了,如果你会用C1 ActiveX中的C1Elastic,这些变化都是零代码实现,而且效果绝对好。所以这个不想费心考虑了。
      

  3.   

    这是另外代码,参考Option Explicit
    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
      

  4.   

    sheridan ActiveResizer Control
      

  5.   

    http://download.csdn.net/source/2544099
    看 看这个例子