[英]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/
锚和停靠属性不起作用,因为它们依赖于父容器,并且此处的矩形位于背景图像上。
问题:我想做类似“相对调整大小和位置”的事情。 那有可能吗? 因此,当我调整窗体大小时,所有面板都适合图像上的矩形。
更新:
这段代码行得通,唯一不好的是,当我调整主窗体的大小时,它“杂乱无章”。 当我在调整大小的同时移动鼠标光标时,它会变得“不平整”。 在我停止调整面板大小后半秒钟后,面板应处于应有的位置。
调整大小时的图片:
当我停止调整大小时以及停止调整大小后半秒后的图像:
关于此的任何建议,还是我应该这样保留? 这里有很多计算,所以这很困难。
使用比例系统。 知道表单正常大小时的所有位置,便可以确定调整大小后的位置。
因此,如果需要在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.