xixiangfeng 发表于 2011-5-9 21:00:43

VS2008编写,窗体大小变化时,窗体内空间自动改变大小以适应窗体变化。或者叫做:控件自动

初写VS程序时,可能就会遇到这个问题:窗体大小变化时候,里面的控件却不跟随窗体变化而使程序界面变得难看。我也是摸索了很久才搞定了这个东东。

   '2011-2-13日实现窗体控件跟随窗体自动改变大小以保持比例

Option Explicit On

Module autosize

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

    '此函数用于保存窗体初始大小
    '在调用ResizeForm前先调用本函数
    Public Sub ResizeInit(ByVal FormName As Form)
      Dim Obj As Control
      FormOldWidth = FormName.Width
      FormOldHeight = FormName.Height
      On Error Resume Next
      For Each Obj In FormName.Controls
            Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "
      Next Obj
      On Error GoTo 0
    End Sub

    '按比例改变表单内各元件的大小, 在调用ReSizeForm前先调用ReSizeInit函数
    Public Sub ResizeForm(ByVal 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.Controls
            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.Location = New Point(Pos(0) * ScaleX, Pos(1) * ScaleY)
                Obj.Size = New Size(Pos(2) * ScaleX, Pos(3) * ScaleY)
            Next I
      Next Obj
      On Error GoTo 0
    End Sub

    '此函数用于根据系统屏幕分辨率自动设置窗体位置及大小
    Public Sub Auto_Just_Sys_Resolution(ByVal FormName As Form)

      Dim sWidthHeight As Rectangle 'Retrieves the bounds of the display that contains the largest portion of the specified rectangle.

      Dim temp_width As Integer, temp_height As Integer '用于根据屏幕分辨率设置窗体初始位置及大小

      sWidthHeight = Screen.GetBounds(FormName) '获得系统屏幕当前分辨率,存在一个rectangle的4元素数组中

      temp_width = sWidthHeight.Width / 16 '将屏幕4等分
      temp_height = sWidthHeight.Height / 16

      FormName.Top = sWidthHeight.X + temp_height '设置窗体左上角坐标
      FormName.Left = sWidthHeight.Y + temp_width
      FormName.Width = sWidthHeight.Width - temp_width * 2 '设置窗体大小
      FormName.Height = sWidthHeight.Height - temp_height * 2
    End Sub

End Module

xixiangfeng 发表于 2011-5-9 21:12:07

调用方法:
Public Class MainForm

    Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      Call ResizeInit(Me) '初始化

    End Sub


    Private Sub MainForm_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
      Call ResizeForm(Me) '调用窗口自适应程序
    End Sub
End Class

_yuming 发表于 2011-5-9 23:06:54

不喜欢VB 比较喜欢使用C#,用C#做的一款软件。。。

已经把 XP 的系统更改成登录后就进入本系统,原来的桌面程序已经删除了。。。。

http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_638591HW2FDJ.jpg
(原文件名:111.jpg)

http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_638592HJYXAS.jpg
(原文件名:222.jpg)

wowbanui 发表于 2011-5-9 23:35:37

用VC的话重写窗口Resize事件,更改控件位置和大小

wowbanui 发表于 2011-5-9 23:37:00

VC++加号不见了

pcwhy 发表于 2011-5-9 23:50:09

不用那么麻烦吧?用ANCHOR和DOCK属性就行了。
我觉得VB.NET比C#还要灵活,尤其是可以像C一样定义全局变量。

xixiangfeng 发表于 2011-5-10 16:58:35

ANCHOR和DOCK属性效果不怎么样啊?

ijlc1314 发表于 2011-7-28 11:13:33

mark

summarize 发表于 2011-8-4 23:43:07

收下了.
页: [1]
查看完整版本: VS2008编写,窗体大小变化时,窗体内空间自动改变大小以适应窗体变化。或者叫做:控件自动