Dim FrmW As Single '存放改变前的窗体的宽度
Dim frmH As Single '存放改变前的窗体的高度Private Sub Form_Load()
If WindowState <> vbMinimized Then
   FrmW = Me.Width
   frmH = Me.Height
   '上面两句是初始化模块变量
End If
End SubPrivate Sub Form_Resize()
If FrmW = 0 Or frmH = 0 Then Exit SubDim MyCon As Control
Dim sig1 As Single, sig2 As Single
sig1 = Me.Width / FrmW
sig2 = Me.Height / frmH
For Each MyCon In Me.Controls
    If TypeOf MyCon Is Label Or _
        TypeOf MyCon Is CommandButton Or _
        TypeOf MyCon Is ListView Or _
        TypeOf MyCon Is TextBox Or _
        TypeOf MyCon Is ComboBox Or _
        TypeOf MyCon Is ListBox Then
        With MyCon
            .Left = Int(.Left * sig1)
            .Top = Int(.Top * sig2)
            .Width = Int(.Width * sig1)
            .Height = Int(.Height * sig2)
        End With
    End If
Next MyConFrmW = Me.Width
frmH = Me.HeightEnd Sub

解决方案 »

  1.   

    应该使用ScaleWidth和Scaleheight,
      另外通过简单的乘法来确定控件的位置是做不到的,因为有起始位置的因数。
      如果一定要做到,则思路如下:
      1 在formload事件里记录每个控件的基本信息(包括起始位置和大小),最好用
        多维数组实现(可以使用自定义类型)
       2 在resize事件中根据变化和前面保存的基本信息做相应的位置和大小处理.
      

  2.   

    '******************************************************
    '原作者:邓勇
    '收集整理:小聪明 [email protected]
    '欢迎访问小聪明的主页VB版: http://coolzm.533.net
    '******************************************************
    '功能::窗体大小改变时窗体内的控件大小也随之动态改变
    '使用方法:
    '在相应的窗体程序中加入如下语句:
    '---------------------------------------------------
    'Private Sub Form_Load()
    '  Call ResizeInit(Me) '在程序装入时必须加入
    'End Sub'Private Sub Form_Resize()
    '  Call ResizeForm(Me) '确保窗体改变时控件随之改变
    'End Sub
    '---------------------------------------------------
    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
        Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "
      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 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
      

  3.   

    怎么还在讨论这个问题?这本身就是在自找麻烦,因为这样做出来的东西效果非常差!你注意IE了么?他在Resize时,绝大部分控件大小和相对窗口的位置都是不变的,只是屏幕中央的空白区域在改变大小。自己试试吧,你这个问题,在理论上是可行的,但是并不能达到你所希望的效果。
      

  4.   

    这个问题我前几天刚刚做过,效果还不错
    方法是对于每个控件,预先计算出他们各自的width,height,left,top
    和附属的form的width或者height的比例,然后在form_resize中,根据新的form
    的width或者height,让他们乘于各个控件的比例系数,就可以达到不错的效果
    Private kx_flex1 As Double          'MSflex1控件_x 与 Form1_x 的比例
    Private ky_flex1 As Double          'MSflex1控件_y 与 Form1_y 的比例
    Private kx_flex2 As Double
    Private ky_flex2 As Double
    Private kx_flex3 As Double
    Private ky_flex3 As DoublePrivate kx_tab As Double           '分项页控件_x 与 Form1_x 的比例
    Private ky_tab As Double           '分项页控件_y 与 Form1_y 的比例
    Private kx_list As Double          'List控件_x 与 Form1_x 的比例
    Private ky_list As Double          'List控件_y 与 Form1_y 的比例
    Private kx_sta As Double           '状态栏控件_x 与 Form1_x 的比例
    Private ky_sta As Double           '状态栏控件_y 与 Form1_y 的比例Private kl_flex1 As Double         'MSflex1控件_left 与 Form1_x 的比例
    Private kt_flex1 As Double         'MSflex1控件_top 与 Form1_y 的比例
    Private kl_flex2 As Double
    Private kt_flex2 As Double
    Private kl_flex3 As Double
    Private kt_flex3 As DoublePrivate kl_tab As Double           '分项页控件_left 与 Form1_x 的比例
    Private kt_tab As Double           '分项页控件_top 与 Form1_y 的比例
    Private kl_list As Double          'List控件_left 与 Form1_x 的比例
    Private kt_list As Double          'List控件_top 与 Form1_y 的比例
    Private kl_sta As Double           '状态栏控件_left 与 Form1_x 的比例
    Private kt_sta As Double           '状态栏控件_top 与 Form1_y 的比例Public Sub change_size()
    kx_flex1 = 0.445833333333333
    ky_flex1 = 0.729090909090909
    kx_flex2 = 0.445833333333333
    ky_flex2 = 0.729090909090909
    kx_flex3 = 0.445833333333333
    ky_flex3 = 0.729090909090909
    kx_tab = 0.968055555555556
    ky_tab = 0.830909090909091
    kx_list = 0.479166666666667
    ky_list = 0.727272727272727
    kx_sta = 0.988888888888889
    ky_sta = 4.54545454545455E-02
    kl_flex1 = 3.33333333333333E-02
    kt_flex1 = 0.101818181818182
    kl_flex2 = 3.33333333333333E-02
    kt_flex2 = 0.101818181818182
    kl_flex3 = 3.33333333333333E-02
    kt_flex3 = 0.101818181818182
    kl_tab = 1.11111111111111E-02
    kt_tab = 5.81818181818182E-02
    kl_list = 0.488888888888889
    kt_list = 0.101818181818182
    kl_sta = 0
    kt_sta = 0.905454545454545Form1.MSFlexGrid1.Width = Form1.Width * kx_flex1
    Form1.MSFlexGrid2.Width = Form1.Width * kx_flex2
    Form1.MSFlexGrid3.Width = Form1.Width * kx_flex3Form1.TabStrip1.Width = Form1.Width * kx_tab
    Form1.List1.Width = Form1.Width * kx_list
    Form1.StatusBar1.Panels(1).Width = Form1.Width * kx_sta
    Form1.MSFlexGrid1.Height = Form1.Height * ky_flex1
    Form1.MSFlexGrid2.Height = Form1.Height * ky_flex2
    Form1.MSFlexGrid3.Height = Form1.Height * ky_flex3Form1.TabStrip1.Height = Form1.Height * ky_tab
    Form1.List1.Height = Form1.Height * ky_list
    Form1.StatusBar1.Height = Form1.Height * ky_staForm1.MSFlexGrid1.Left = Form1.Width * kl_flex1
    Form1.MSFlexGrid2.Left = Form1.Width * kl_flex2
    Form1.MSFlexGrid3.Left = Form1.Width * kl_flex3Form1.TabStrip1.Left = Form1.Width * kl_tab
    Form1.List1.Left = Form1.Width * kl_list
    'StatusBar1.Panels(1).Left = Form1.Width * kl_sta
    Form1.MSFlexGrid1.Top = Form1.Height * kt_flex1
    Form1.MSFlexGrid2.Top = Form1.Height * kt_flex2
    Form1.MSFlexGrid3.Top = Form1.Height * kt_flex3Form1.TabStrip1.Top = Form1.Height * kt_tab
    Form1.List1.Top = Form1.Height * kt_list
    Form1.StatusBar1.Top = Form1.Height * kt_sta
    End Sub
      

  5.   

    关键在于要预先生成各个控件和form.width或者和form.height的比例
    这个其实很好办,在form.load事件中计算一遍就知道了
    另外,还要预先计算下列两项:1 form.width和当前screen.width的比例
    2 form.width和当前screen.height的比例例如第一项计算为0.7401042 
    第二项为0.7434896 Form1.Width = 0.7401042 * Screen.Width    '根据不同分辨率保证窗体大小与屏幕大小的比例
    Form1.Height = 0.7434896 * Screen.Height这样窗体还可以根据不同的分辨率自动调整窗体大小
      

  6.   

    Private Sub Form_Resize()
    '保证窗体大小变化的时候各控件的大小和位置不难看
    Text1.Width = Me.ScaleWidth - 480
    Command1.Left = Text1.Width + Text1.Left - Command1.Width - 30
    TreeView1.Top = Text1.Top + Text1.Height + 300
    DataGrid1.Top = Text1.Top + Text1.Height + 300
    TreeView1.Height = Me.ScaleHeight - Text1.Top - Text1.Height - 600
    TreeView1.Width = Me.ScaleWidth * 0.3
    DataGrid1.Height = Me.ScaleHeight - Text1.Top - Text1.Height - 600
    DataGrid1.Left = TreeView1.Left + TreeView1.Width + 300
    DataGrid1.Width = Me.Width - TreeView1.Left - Me.ScaleWidth * 0.3 - 690
    End Sub