我有以下情况,我想将Button1
放在正下方并水平对齐Button 2
,但仍然Button1
位于groupBox1
,而Button 2
位于groupBox2
:
我看过几篇关于PointToClient()
和PointToScreen()
的帖子,但在这种情况下仍然无法在不同容器之间正确翻译 - groupBox1
和groupBox2
。
我已经尝试了下面代码的一些变体(例如,每当调整窗体大小时尝试重新定位按钮),但我仍然对这究竟是如何工作感到困惑。
具体来说,我似乎不清楚control
我应该打PointToScreen()
哪个,以及我应该将哪些参数传递给该方法以实现我上面所描述的内容。
private void Form1_Paint(object sender, PaintEventArgs e)
{
var btn2Pos = button2.PointToScreen(button2.Location);
button1.Location = button1.PointToClient(btn2Pos);
}
解决这个问题的最简单方法是什么?
旁注,这样做的原因:
我希望能够禁用groupBox2
及其中的所有控件,但仍然保持确定 启用了button 1
之类的控件,即使它们已定位 相对于button 2
。
答案 0 :(得分:1)
我认为您不需要在此使用PointToClient
和PointToScreen
:
//This will place button1 over button2
button1.Left = groupBox2.Left + button2.Left;
button1.Top = groupBox2.Top + button2.Top;
如果您想使用PointToClient
和PointToScreen
,可以执行以下操作:
//The code should be placed in Form load, if placing in form Constructor, the result may be not expected.
private void Form1_Load(object sender, EventArgs e){
//This will place button1 over button2
button1.Location = groupBox1.PointToClient(groupBox2.PointToScreen(button2.Location));
}
答案 1 :(得分:0)
您可以通过考虑不同的相对位置来依赖.Left / .Top属性。例如:
button1.Location = positining(button1);
通过在这些行上调用函数:
private Point positining(Button curButton)
{
Point outPoint = new Point();
if(curButton == button1)
{
outPoint.X = groupBox2.Left + button2.Right + 20;
outPoint.Y = groupBox2.Top + button2.Bottom - 20;
}
else if (curButton == button2)
{
outPoint.X = groupBox2.Left + button1.Left - 20 - button2.Width;
outPoint.Y = groupBox2.Top + button1.Top + 20 + button2.Height;
}
return outPoint;
}
答案 2 :(得分:0)
我很欣赏这里的答案,但最后根据同事的提议最终使用了以下解决方案:
我创建了另一个第三个容器,但这个容器没有边框。该容器与groupBox2
完全重叠,button1
位于该容器内,因此相对于它。
由于新容器的点(0,0)与groupBox2
中的等效点重叠,因此任何容器中具有相同坐标的任何控件都将位于同一位置,而我需要的只是如果需要,请确保调用BringToFront()
(和/或SendToBack()
)以确保正确显示控件。