如何确定控件是否在表单C之外#

时间:2016-12-08 11:52:50

标签: c# forms

我正在尝试确定动态添加的控件是否在表单之外。

起初,我认为可以通过获取表单的高度和动态添加控件的位置来计算它。

但我注意到Control.LocationForm.Height没有“共同点”。

我认为我真的不明白高度和位置之间的相关性。

例如:
我认为如果你的表单高度为500,我把控件放在表单的底部,它应该给出位置:X,500(X是宽度,这里不相关)。但这不正确,它告诉我例如:X,465。我错过了什么?

所以我需要能够识别控件是否在表单之外,即使它只是一个像素。

我在SO上找到了几个类似的问题,但不幸的是,这并没有真正给我答案。

那么,有没有办法做到这一点?有可能计算出来吗?

4 个答案:

答案 0 :(得分:2)

表单的Height还包括标题栏和边框的高度。 您可以使用表单的ClientSize

来自MSDN的文档:

  

表单客户区的大小是表单的大小,不包括边框和标题栏。表单的客户区域是可以放置控件的表单中的区域。在执行图形操作或在窗体上调整大小和定位控件时,可以使用此属性来获取正确的尺寸。要获取整个表单的大小,请使用“大小”属性或使用单个属性“高度”和“宽度”。

控件的位置是相对于其容器的,因此(0,0)是表单的左上角

Illustration with control

答案 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);