2013-01-17 83 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