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

さて、ここではあいまいな例を構築するだけです。 3つのモニターがお互いに並んでいて、それぞれが800ピクセル幅であるとします。モニター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

関連する問題