搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2011-5-9 21:00:43 | 显示全部楼层 |阅读模式
初写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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 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

出0入0汤圆

发表于 2011-5-9 23:06:54 | 显示全部楼层
不喜欢VB 比较喜欢使用C#,用C#做的一款软件。。。

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


(原文件名:111.jpg)


(原文件名:222.jpg)

出0入0汤圆

发表于 2011-5-9 23:35:37 | 显示全部楼层
用VC  的话重写窗口Resize事件,更改控件位置和大小

出0入0汤圆

发表于 2011-5-9 23:37:00 | 显示全部楼层
VC++加号不见了

出15入9汤圆

发表于 2011-5-9 23:50:09 | 显示全部楼层
不用那么麻烦吧?用ANCHOR和DOCK属性就行了。
我觉得VB.NET比C#还要灵活,尤其是可以像C一样定义全局变量。

出0入0汤圆

 楼主| 发表于 2011-5-10 16:58:35 | 显示全部楼层
ANCHOR和DOCK属性效果不怎么样啊?

出0入0汤圆

发表于 2011-7-28 11:13:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-4 23:43:07 | 显示全部楼层
收下了.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表