【问题标题】:How to determine if control is outside of Form?如何确定控件是否在表单之外?
【发布时间】:2021-09-12 23:23:48
【问题描述】:

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

起初,我以为可以通过获取窗体的高度,以及动态添加的控件的位置来计算它。

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

我认为我并不真正了解高度和位置之间的相关性。

例如:
我认为如果您的表单的高度为 500,并且我将控件放在表单的底部,它应该给出 Location: X, 500 (X 是宽度,这里不相关)。但这不正确,它向我显示例如:X, 465。我错过了什么吗?

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

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

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

【问题讨论】:

  • 表格是什么意思?这是网页还是windows?请显示代码或创建MCVE
  • 表格左上角为(0,0),x向下偏移为正,y向右偏移。控件的参考位置可以是左上角或控制中心。
  • @Liam 我没有任何代码可以给你看,这是 Windows 窗体。我唯一能说的是,假设我有 label1,我把它放在表单的底部,然后得到 label1.Location,它显示 0, 465 而不是 0, 500,这是我不明白的.
  • 这是因为Label.Location.Y + Label.Height = 500, 465 + 35 = 500
  • @Dusan 嗯,可能是这样,如果我有更多信息,我会回复你,谢谢!

标签: c# winforms


【解决方案1】:

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

来自MSDN上的文档:

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

控件的位置是相对于它的容器的,所以(0,0)是左上角窗体内。

【讨论】:

  • 好的,谢谢你的意见,我试试这个。我曾考虑过标题栏和边框,但我发现它很奇怪,因为当我将控件放在左上角时,它会显示 0、0,而我希望它是 0、30。可能是我只是犯了一个愚蠢的错误。再次感谢,我会试试这个!
  • 在计算机图形学中,Y 通常与数学笛卡尔平面 Y 相反
  • 好吧,这太棒了。这就是我需要的。非常感谢您的视觉效果和时间!
  • 是的 Form.ClientSize 属性用于这种方法。
【解决方案2】:

我知道这是一个较旧的线程,但您可以尝试使用此方法:

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;
        }
    }

它用于检查控件是否超出其父窗体的范围。

【讨论】:

  • 虽然 S. Ferrell 的答案是正确的,但它只检查控件是否超出底部和右侧的边界,但很容易添加其他两个检查。
【解决方案3】:

您可以使用此代码检查控件是否在表单内:

var Inside = frm.ClientRectange.Intersect(ctrl.Bounds) == ctrl.Bounds;

【讨论】:

    【解决方案4】:

    窗体的左上角是(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。对于任何边框样式和任何分辨率,差异总是相同的。

    要在表单上放置控件,请使用表单中的位置结构或使用控件的顶部和左侧属性;顶部 = x,左侧 = y。 记住您测量的实际高度和宽度以及控件尺寸的偏移量。 要在右下角添加一个尺寸为 80*30 的按钮,我会这样做:

    button1.Location = new System.Drawing.Point(402, 430);
    

    左下角:

    button1.Location = new System.Drawing.Point(0, 430);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多