调整表格的大小,就像是图片一样

时间:2018-12-26 07:10:54

标签: c# forms winforms

我正在使用Visual Studio 2017的表单设计器,但是我发现无法通过模拟图片大小调整的方式来调整表单的大小。当我将表单的大小调整为大25%时,我希望内部的所有项目都增长25%,每个控件之间的间距也要增长该数量,而控件和表单边框之间的间距应增长25%。

我附上了这种情况的照片

What happens

When using anchor

What i want

有人可以指出我要实现这一目标的图书馆/方法吗?

1 个答案:

答案 0 :(得分:2)

这不是开箱即用的;我仍然认为这不是很有用;但是也许您的特殊应用程序需要

这是以下几行的结果:

enter image description here

这是示例代码:

首先,我们需要通过在每个控件的Tag中存储旧的边界以及原始父级大小来进行设置:

    // pick the top parent; in my case it wa a TabPage (not shown)
    Control ctrl = pickTheParent;  
    foreach (Control c in ctrl.Controls) StoreBounds(ctrl, c);
    ctrl.Resize += (ss, ee) =>
    {
        foreach (Control c in ctrl.Controls)  ScaleBounds(c);
    };

我们还为父项的Resize事件设置了大小调整例程。

所有控件(包括嵌套控件)都必须进行存储和调整大小;因此它们是递归的。

void StoreBounds(Control parent, Control ctl)
{
    ctl.Tag = new Tuple<Size, Rectangle>(parent.ClientSize, ctl.Bounds);
    // **
    foreach (Control c in ctl.Controls)  StoreBounds(ctl, c);
}


void ScaleBounds(Control ctl)
{
    ctl.Bounds = ScaledBounds(ctl);
    foreach (Control c in ctl.Controls)  ScaleBounds(c);
}

调整大小仅计算旧比率,然后从中计算新比率:

Rectangle ScaledBounds(Control c)
{
    if (c.Tag == null) return c.Bounds;
    Rectangle old = ((Tuple<Size, Rectangle>)c.Tag).Item2;
    Size frame1 = ((Tuple<Size, Rectangle>)c.Tag).Item1;
    Size frame2 = c.Parent.ClientSize;
    float rx = 1f * frame2.Width / frame1.Width;
    float ry = 1f * frame2.Height / frame1.Height;
    int x = (int)(old.Left * rx);
    int y = (int)(old.Top * ry);
    int w = (int)(old.Width * rx);
    int h = (int)(old.Height * ry);
    return new Rectangle(x,y,w,h);
}

请注意,对于所显示的效果,我必须关闭所有AutoSize属性。

还请注意,所有Anchors(和任何Docks)都已删除。要自动执行此操作,您可以在存储代码(**)中添加一行或两行代码。.

 ctl.Anchor = AnchorStyles.None;

您可以自行决定删除Docking,也许实际上仍然有用,例如Fill ..?

还要注意,该示例严格处理SizeLocation;没有其他属性受到影响。对于某些人,尤其是Fonts,人们可以添加更多代码;例如在Item上添加第三个Tuple来存储原始的FontSize。对于其他Border宽度,没有想到合理的大小调整方法。

PictureBox显然设置为Zoom