2013-01-17 54 views
6

我想详细说明整个表单在屏幕上是否可见。为了澄清这一点:我不在乎表单是部分还是完全被另一个表单隐藏,我只想知道,如果表单完全在屏幕上。检查表单是否在所有屏幕的边界

在Windows中,可以移动窗体,使其隐藏一半。这是因为你可以将它们移动到任何显示器的实际边界之外。 (进一步向左,向右或向下)。如何以简单的方式检查是否属于这种情况?

我想我可以做的是检查表单是否在SystemInformation.VirtualScreen的范围内。这里的问题是,虚拟屏幕的每个像素都不是真正可见的。当然,这将工作,如果SystemInformation.MonitorCount = 1

仍然我不是很满意这一点。

回答

3

我能想到的最佳方式是您检查窗体的所有四个角落都在屏幕上。像这样:

public bool FormOnScreen(Form frm) { 
     if (frm.IsHandleCreated) throw new InvalidOperationException(); 
     if (!frm.Visible || frm.WindowState == FormWindowState.Minimized) return false; 
     return PointVisible(new Point(frm.Left, frm.Top)) && 
       PointVisible(new Point(frm.Right, frm.Top)) && 
       PointVisible(new Point(frm.Right, frm.Bottom)) && 
       PointVisible(new Point(frm.Left, frm.Bottom)); 
    } 

    private static bool PointVisible(Point p) { 
     var scr = Screen.FromPoint(p); 
     return scr.Bounds.Contains(p); 
    } 
+0

好吧,我只需要在这里构建一个不起眼的例子。想象一下,三台显示器相互对齐,每台宽800px。显示器1和3高600px,显示器2(中间一个)高400px。虚拟屏幕的房地产将是1800px * 600px。如果显示器2将在其他显示器的顶部对齐,则虚拟屏幕底部将会有200px,这是不可见的。现在我可以跨越显示器1到显示器3的一个窗口,整个窗体将不可见,显示器2上的底部将被遗漏。 –

+2

那么,您需要编写更多的代码来处理这种情况。祝你好运。 –

+0

我知道,这只是一个非常构建的例子。我希望它永远不会这样。 –

4
Public Function IsOnScreen(ByVal form As Form) As Boolean 
    Dim screens() As Screen = Screen.AllScreens 

    For Each scrn As Screen In screens 
     Dim formRectangle As Rectangle = New Rectangle(form.Left, form.Top, form.Width, form.Height) 

     If scrn.WorkingArea.Contains(formRectangle) Then 
      Return True 
     End If 
    Next 

    Return False 
End Function 
+3

为什么在地球上使用DoEvents? –

+0

如果窗口最大化,则返回'False'。 – CrazyTim