调整表单大小时,C#调整表单中的所有元素

时间:2010-06-12 00:37:38

标签: c# image forms resize background

我将此图片作为表单的背景: enter image description here


所以我的表单看起来像这样: http://img823.imageshack.us/i/cisto.jpg/


当我调整大小时,它看起来像这样:http://img820.imageshack.us/i/cistoumanjeno.jpg/


现在我需要做的是将听众放在图片上的每个矩形上:http://img810.imageshack.us/img810/238/18887457.jpg


我制作了透明面板并将它们放在表格上以匹配图像上的矩形(在图像上,面板是绿色的,这样你就可以看到它们的位置):http://img809.imageshack.us/i/paneli.jpg/


但是当我调整表单大小时,它会像这样:http://img810.imageshack.us/i/paneliumanjeno.jpg/


锚点和停靠栏属性不起作用,因为它们依赖于父容器,此处矩形位于背景图像上。


问题: 我想做一些像“相对调整和位置”的事情。那可能吗?因此,当我调整窗体大小时,所有面板都适合图像上的矩形。

更新
这段代码有效,唯一不好的是当我调整主窗体大小时,它会“捣乱”。当我在调整大小时移动鼠标光标时它不会平滑,它会“晃动”。在我停止调整面板尺寸后半秒钟后他们应该在那里。

调整大小时的图像: http://img13.imageshack.us/img13/3408/whileresizing.png

当我停止调整大小时的图像,并在停止调整大小后半秒后: http://img99.imageshack.us/img99/7718/resizef.jpg

关于那个或我的任何建议都应该这样离开吗?这里有很多计算,这就是为什么它会挣扎。

2 个答案:

答案 0 :(得分:2)

使用比例系统。当表单处于正常大小时知道所有内容的位置,您可以确定调整大小时的位置。

因此,如果需要在X:125 Y:130处绘制矩形(具有常规尺寸),并且正常尺寸为X:500 Y:550
那么比例就是

x:125/500 = x / NewXSize
y:130/550 = y / NewYSize

x = NewXSize *(125/500)
y = NewYSize *(130/550)
(未经测试)
最大

答案 1 :(得分:1)

建立并扩展mazzzzz的答案,我建议如下:

class MyForm : Form
{
:
List<Panel> m_panels = new List<Panel>();
List<Point> m_points = new List<Point>();
Size m_originalSize;

IEnumerable<Panel> FindPanels()
{
    foreach(var control in Controls)
    {
        Panel panel = control as Panel;
        if (panel != null)
            yield return panel;
    }
}

void SnapshotOriginalLayout()
{
    m_originalSize = ClientSize; 
    foreach(var panel in FindPanels())
    {
        m_panels.Add(panel);
        m_points.Add(panel.Location);
        m_points.Add(new Point(panel.Size));
    }
}

Point [] GetTransformedPoints()
{
    var points = m_points.ToArray();
    Matrix m = new Matrix();
    m.Scale(ClientSize.Width / (float) m_originalSize.Width,
            ClientSize.Height / (float) m_originalSize.Height);
    m.Transform(points);
    return points;
}

void ApplyTransformedPoints(Point [] points)
{
    int index = 0;
    foreach(var panel in m_panels)
    {
        panel.Bounds = new Rectangle(points[index],
                                     new Size(points[index + 1]));
        index += 2;
    }
}

void ResizePanels()
{
    if (m_originalSize.Width == 0 ||
        m_originalSize.Height == 0)
        return;

    ApplyTranformedPoints(GetTranformedPoints());
}

protected override void OnShown(EventArgs e)
{
    SnapshotOriginalLayout();
    base.OnShown(e);
}

protected override void OnResizeEnd(EventArgs e)
{
    base.OnResizeEnd(e);
    RescalePanels();
}
:
}

上面的代码目前尚未经过测试。如果您有任何菜单,工具栏,状态栏等,您可能需要调整m_originalSize值以及从面板中减去偏移量。存储在m_points列表中的位置。

希望这给你一个很好的起点。