我将此图片作为表单的背景:
所以我的表单看起来像这样: 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/
锚点和停靠栏属性不起作用,因为它们依赖于父容器,此处矩形位于背景图像上。
问题: 我想做一些像“相对调整和位置”的事情。那可能吗?因此,当我调整窗体大小时,所有面板都适合图像上的矩形。
更新
这段代码有效,唯一不好的是当我调整主窗体大小时,它会“捣乱”。当我在调整大小时移动鼠标光标时它不会平滑,它会“晃动”。在我停止调整面板尺寸后半秒钟后他们应该在那里。
调整大小时的图像:
当我停止调整大小时的图像,并在停止调整大小后半秒后:
关于那个或我的任何建议都应该这样离开吗?这里有很多计算,这就是为什么它会挣扎。
答案 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列表中的位置。
希望这给你一个很好的起点。