我正在尝试确定动态添加的控件是否在表单之外。
起初,我认为可以通过获取表单的高度和动态添加控件的位置来计算它。
但我注意到Control.Location
和Form.Height
没有“共同点”。
我认为我真的不明白高度和位置之间的相关性。
例如:
我认为如果你的表单高度为500,我把控件放在表单的底部,它应该给出位置:X,500(X是宽度,这里不相关)。但这不正确,它告诉我例如:X,465。我错过了什么?
所以我需要能够识别控件是否在表单之外,即使它只是一个像素。
我在SO上找到了几个类似的问题,但不幸的是,这并没有真正给我答案。
那么,有没有办法做到这一点?有可能计算出来吗?
答案 0 :(得分:2)
表单的Height
还包括标题栏和边框的高度。
您可以使用表单的ClientSize
:
来自MSDN的文档:
表单客户区的大小是表单的大小,不包括边框和标题栏。表单的客户区域是可以放置控件的表单中的区域。在执行图形操作或在窗体上调整大小和定位控件时,可以使用此属性来获取正确的尺寸。要获取整个表单的大小,请使用“大小”属性或使用单个属性“高度”和“宽度”。
控件的位置是相对于其容器的,因此(0,0)
是表单的左上角 。
答案 1 :(得分:1)
我知道这是一个较旧的线程,但是您可以尝试使用此方法:
public static bool IsOutofBounds(Form form, Control control)
{
int controlEnd_X = control.Location.X + control.ClientSize.Width;
int controlEnd_Y = control.Location.Y + control.ClientSize.Height;
if (form.ClientSize.Width < controlEnd_X || form.ClientSize.Height < controlEnd_Y)
{
return true;
}
else
{
return false;
}
}
它用于检查控件是否超出其父窗体的范围。
答案 2 :(得分:0)
您可以使用此代码检查控件是否在窗体内:
var Inside = frm.ClientRectange.Intersect(ctrl.Bounds) == ctrl.Bounds;
答案 3 :(得分:0)
表单的左上角是(0,0)右下角是(formHeight,fromWidth)。 检查这个位置在表单上的两个文本框,并在鼠标移动事件中写入此代码,以查看x和y如何更改。
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
textBox1.Text = e.X.ToString();
textBox2.Text = e.Y.ToString();
}
请注意,从表单边缘返回的数字与您选择的大小之间存在差异。在我的500 * 500表格中,它实际上是460 * 483。任何边框样式和任何分辨率的差异总是相同的。
要在表单上放置控件,请使用表单中的位置结构,或使用控件的顶部和左侧属性; top = x,left = y。 记住您从实际测量的高度和宽度以及控件尺寸的偏移量。 要在右下角添加一个尺寸为80 * 30的按钮,我会这样:
button1.Location = new System.Drawing.Point(402, 430);
左下角:
button1.Location = new System.Drawing.Point(0, 430);