繁体   English   中英

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

[英]C# resize all elements in form when resizing form

我将此图像作为表单的背景: 在此处输入图片说明


所以我的表单看起来像这样: 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

关于此的任何建议,还是我应该这样保留? 这里有很多计算,所以这很困难。

使用比例系统。 知道表单正常大小时的所有位置,便可以确定调整大小后的位置。

因此,如果需要在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)
(未测试)
最高

建立并扩展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列表中。

希望这为您提供一个良好的起点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM