none
VB.NET中控件自动改变大小的问题 RRS feed

  • 问题

  •  

    在VB.NET编程时,为了解决控件随分辨率或窗体自动改变大小的问题,我找到一段代码如下:

    Private FormOldWidth As Long '保存窗体的原始宽度
    Private FormOldHeight As Long '保存窗体的原始高度


    '在调用ResizeForm前先调用本函数
    Public Sub ResizeInit(FormName As Form)

    Dim Obj As Control
    FormOldWidth = FormName.Width
    FormOldHeight = FormName.Height
    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.Width / FormOldWidth '保存窗体宽度缩放比例
    ScaleY = FormName.Height / 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

     

    Private Sub Form_Load()

    Call ResizeInit(Me) '在程序装入时必须加入

    End Sub

     

    Private Sub Form_Resize()

    Call ResizeForm(Me) '确保窗体改变时控件随之改变

    End Sub

     

    调试时系统会在“FormName”处出错误 “表达式的类型为“System.Windows.Forms.Form”,该类型不是集合类型。 ,如果把"FormName"改成“Me.controls”这个错误就消失了,但此时系统在“Obj.Move”处又提示错误 “Public Event Move(sender As Object, e As System.EventArgs)”是事件,不能直接调用。请使用“RaiseEvent”语句引发事件。 "我该怎么办?我是新手,请多多帮忙

    2008年11月28日 1:59

答案

  •  快乐风雨 写:

     

    在VB.NET编程时,为了解决控件随分辨率或窗体自动改变大小的问题,我找到一段代码如下:

    Private FormOldWidth As Long '保存窗体的原始宽度
    Private FormOldHeight As Long '保存窗体的原始高度


    '在调用ResizeForm前先调用本函数
    Public Sub ResizeInit(FormName As Form)

    Dim Obj As Control
    FormOldWidth = FormName.Width
    FormOldHeight = FormName.Height
    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.Width / FormOldWidth '保存窗体宽度缩放比例
    ScaleY = FormName.Height / 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

     

    Private Sub Form_Load()

    Call ResizeInit(Me) '在程序装入时必须加入

    End Sub

     

    Private Sub Form_Resize()

    Call ResizeForm(Me) '确保窗体改变时控件随之改变

    End Sub

     

    调试时系统会在“FormName”处出错误 “表达式的类型为“System.Windows.Forms.Form”,该类型不是集合类型。 ,如果把"FormName"改成“Me.controls”这个错误就消失了,但此时系统在“Obj.Move”处又提示错误 “Public Event Move(sender As Object, e As System.EventArgs)”是事件,不能直接调用。请使用“RaiseEvent”语句引发事件。 "我该怎么办?我是新手,请多多帮忙

     

    你贴的代码是vb6的 在.net自然有点问题

     

      form 的子对象枚举、  确实修改好了

     

    第二个

     

    Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY

    可以修改为

    Obj.left  =Pos(0) * ScaleX

    Obj.top=Pos(1) * ScaleY

    Obj.width=Pos(2) * ScaleX

    Obj.Height =Pos(3) * ScaleY

     

     

    或者新建两个对象 System.drawing.size   ;  system.drawing.point

    扔到

    obj.Size
    obj.Location

    里面去

    2008年11月28日 4:43
  •  

    建议你通过设置控件的Anchor属性和Dock属性来使控件跟随窗体大小改变

     

    示例:

    Button1.Anchor = AnchorStyles.Left Or AnchorStyles.Top

     

     

    2008年11月28日 14:08

全部回复

  • 这是vb6的

     

    试试

    Code Snippet

    Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None

     

     

    2008年11月28日 4:17
    版主
  •  快乐风雨 写:

     

    在VB.NET编程时,为了解决控件随分辨率或窗体自动改变大小的问题,我找到一段代码如下:

    Private FormOldWidth As Long '保存窗体的原始宽度
    Private FormOldHeight As Long '保存窗体的原始高度


    '在调用ResizeForm前先调用本函数
    Public Sub ResizeInit(FormName As Form)

    Dim Obj As Control
    FormOldWidth = FormName.Width
    FormOldHeight = FormName.Height
    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.Width / FormOldWidth '保存窗体宽度缩放比例
    ScaleY = FormName.Height / 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

     

    Private Sub Form_Load()

    Call ResizeInit(Me) '在程序装入时必须加入

    End Sub

     

    Private Sub Form_Resize()

    Call ResizeForm(Me) '确保窗体改变时控件随之改变

    End Sub

     

    调试时系统会在“FormName”处出错误 “表达式的类型为“System.Windows.Forms.Form”,该类型不是集合类型。 ,如果把"FormName"改成“Me.controls”这个错误就消失了,但此时系统在“Obj.Move”处又提示错误 “Public Event Move(sender As Object, e As System.EventArgs)”是事件,不能直接调用。请使用“RaiseEvent”语句引发事件。 "我该怎么办?我是新手,请多多帮忙

     

    你贴的代码是vb6的 在.net自然有点问题

     

      form 的子对象枚举、  确实修改好了

     

    第二个

     

    Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY

    可以修改为

    Obj.left  =Pos(0) * ScaleX

    Obj.top=Pos(1) * ScaleY

    Obj.width=Pos(2) * ScaleX

    Obj.Height =Pos(3) * ScaleY

     

     

    或者新建两个对象 System.drawing.size   ;  system.drawing.point

    扔到

    obj.Size
    obj.Location

    里面去

    2008年11月28日 4:43
  •  

    请问你这段代码我应该放在什么位置?
    2008年11月28日 5:58
  •  

    建议你通过设置控件的Anchor属性和Dock属性来使控件跟随窗体大小改变

     

    示例:

    Button1.Anchor = AnchorStyles.Left Or AnchorStyles.Top

     

     

    2008年11月28日 14:08