首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# winform 控件定位随着窗体的变化而变化解决方案

2014-01-13 
C# winform 控件定位随着窗体的变化而变化目前的窗体为我最大化后的窗体为现在是里面的图标根本就没有等比

C# winform 控件定位随着窗体的变化而变化
目前的窗体为C# winform 控件定位随着窗体的变化而变化解决方案
我最大化后的窗体为C# winform 控件定位随着窗体的变化而变化解决方案


现在是里面的图标根本就没有等比例改为显示位置,加急求解,在线等!!!谢谢高手助解决此问题!!!
[解决办法]


Public Class Form1
    Dim x As Single = 0
    Dim y As Single = 0
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '得到原始窗体大小
        x = Me.Width
        y = Me.Height
        setTag(Me)
    End Sub
    Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
        '得到现在窗体的大小,然后根据原始大小计算缩放比例
        Dim newx As Single = Me.Width / x
        Dim newy As Single = Me.Height / y
        setControls(newx, newy, Me)
    End Sub
    '递归取控件的原始大小和位置,用tag来纪录
    Private Sub setTag(ByVal obj As Object)
        For Each con As Control In obj.Controls
            con.Tag = con.Width & ":" & con.Height & ":" & con.Left & ":" & con.Top & ":" & con.Font.Size
            '如果是容器控件,则递归继续纪录
            If con.Controls.Count > 0 Then
                setTag(con)
            End If
        Next
    End Sub
    '递归重新设定控件的大小和位置
    Private Sub setControls(ByVal newx As Single, ByVal newy As Single, ByVal obj As Object)
        For Each con As Control In obj.Controls
            con.AutoSize = False
            Dim mytag() As String = con.Tag.ToString.Split(":")
            con.Width = mytag(0) * newx
            con.Height = mytag(1) * newy
            con.Left = mytag(2) * newx
            con.Top = mytag(3) * newy
            '计算字体缩放比例,缩放字体
            Dim currentSize As Single = (mytag(1) * newy * mytag(4)) / mytag(1)
            con.Font = New Font(con.Font.Name, currentSize, _
                con.Font.Style, con.Font.Unit)
            '如果是容器控件,则递归继续缩放
            If con.Controls.Count > 0 Then
                setControls(newx, newy, con)
            End If
        Next

    End Sub
End Class

这段代码是COPY网上的,可以借鉴下思路
[解决办法]
引用:
Quote: 引用:

 


Public Class Form1
    Dim x As Single = 0
    Dim y As Single = 0
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '得到原始窗体大小
        x = Me.Width
        y = Me.Height
        setTag(Me)
    End Sub
    Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
        '得到现在窗体的大小,然后根据原始大小计算缩放比例
        Dim newx As Single = Me.Width / x
        Dim newy As Single = Me.Height / y
        setControls(newx, newy, Me)
    End Sub
    '递归取控件的原始大小和位置,用tag来纪录
    Private Sub setTag(ByVal obj As Object)
        For Each con As Control In obj.Controls
            con.Tag = con.Width & ":" & con.Height & ":" & con.Left & ":" & con.Top & ":" & con.Font.Size
            '如果是容器控件,则递归继续纪录
            If con.Controls.Count > 0 Then
                setTag(con)
            End If
        Next
    End Sub
    '递归重新设定控件的大小和位置
    Private Sub setControls(ByVal newx As Single, ByVal newy As Single, ByVal obj As Object)
        For Each con As Control In obj.Controls
            con.AutoSize = False
            Dim mytag() As String = con.Tag.ToString.Split(":")
            con.Width = mytag(0) * newx
            con.Height = mytag(1) * newy
            con.Left = mytag(2) * newx
            con.Top = mytag(3) * newy
            '计算字体缩放比例,缩放字体
            Dim currentSize As Single = (mytag(1) * newy * mytag(4)) / mytag(1)
            con.Font = New Font(con.Font.Name, currentSize, _
                con.Font.Style, con.Font.Unit)
            '如果是容器控件,则递归继续缩放
            If con.Controls.Count > 0 Then
                setControls(newx, newy, con)
            End If
        Next

    End Sub
End Class


这段代码是COPY网上的,可以借鉴下思路


这个是差不多是可以根据窗体的大小而更改显示位置的,但他把我的控件大小也给更改了啊,能不能不要改更控件的大小啊


public static void AutoScale(Form frm)
        {
            frm.Tag = frm.Width.ToString() + "," + frm.Height.ToString();
            frm.SizeChanged += new EventHandler(frm_SizeChanged);
        }

        static void frm_SizeChanged(object sender, EventArgs e)
        {
            string[] tmp = ((Form)sender).Tag.ToString().Split(',');
            float width = (float)((Form)sender).Width / (float)Convert.ToInt16(tmp[0]);
            float heigth = (float)((Form)sender).Height / (float)Convert.ToInt16(tmp[1]);

            ((Form)sender).Tag = ((Form)sender).Width.ToString() + "," + ((Form)sender).Height;



            foreach (Control control in ((Form)sender).Controls)
            {
                control.Scale(new SizeF(width, heigth));

            }
        }



这个也可以实现的,但同样也是更改了控件的大小了,这样就不是我所需要的啦

代码里面不是有控件的缩放吗?你把那段代码注释掉试下...
[解决办法]
第一种按比例位置对齐

public static void AutoScale(Form frm)
        {
            frm.Tag = frm.Width.ToString() + "," + frm.Height.ToString();
            frm.SizeChanged += new EventHandler(frm_SizeChanged);
        }

        static void frm_SizeChanged(object sender, EventArgs e)
        {
            string[] tmp = ((Form)sender).Tag.ToString().Split(',');
            float width = (float)((Form)sender).Width / (float)Convert.ToInt16(tmp[0]);
            float heigth = (float)((Form)sender).Height / (float)Convert.ToInt16(tmp[1]);

            ((Form)sender).Tag = ((Form)sender).Width.ToString() + "," + ((Form)sender).Height;

            foreach (Control control in ((Form)sender).Controls)
            {
                control.Location =new Point((int) (control.Location.X * width +  (width-1)* control.Width/2),(int)(control.Location.Y * heigth + (heigth - 1) * control.Height/2));
            }
        }


第二种按绝对位置对齐,我觉得你想要的可能是第二种,除了中的图标代码实现,其他的可以设置Anchor属性实现。

public static void AutoScale(Form frm)
        {
            frm.Tag = frm.Width.ToString() + "," + frm.Height.ToString();
            frm.SizeChanged += new EventHandler(frm_SizeChanged);
            foreach (Control control in frm.Controls)
            {
                if (control.Anchor==AnchorStyles.None)
                {
                    control.Tag = control.Top.ToString() + "," + control.Left.ToString();
                }
            }
        }

        static void frm_SizeChanged(object sender, EventArgs e)
        {
            string[] tmp = ((Form)sender).Tag.ToString().Split(',');
            float width = (float)((Form)sender).Width / (float)Convert.ToInt16(tmp[0]);
            float heigth = (float)((Form)sender).Height / (float)Convert.ToInt16(tmp[1]);

            ((Form)sender).Tag = ((Form)sender).Width.ToString() + "," + ((Form)sender).Height;

            foreach (Control control in ((Form)sender).Controls)
            {
                 if (control.Anchor==AnchorStyles.None)
                {
                    string[] coltmp=control.Tag.ToString().Split(',');
                    control.Left = (int)(Convert.ToInt16(coltmp[1]) * width + control.Width / 2 * (width - 1));


                    control.Top = (int)(Convert.ToInt16(coltmp[0]) * heigth + control.Height / 2 * (heigth - 1));
                    control.Tag = control.Top.ToString() + "," + control.Left.ToString();
                }

            }
        }

热点排行