7

フォーム全体が画面に表示されるかどうかを詳しく説明しようとしています。これを明確にするために:フォームが別のフォームによって部分的または完全に隠されているかどうかは関係ありません。フォームが完全に画面に表示されているかどうかを知りたいだけです。

Windowsでは、フォームを移動して、途中で非表示にすることができます。これは、モニターの実際の境界を超えて移動できるためです。(さらに左、右、または下にあります。)それが事実であるかどうかを簡単に確認するにはどうすればよいですか?

私ができると思ったのは、フォームがの範囲内にあるかどうかを確認することですSystemInformation.VirtualScreen。ここでの問題は、仮想画面のすべてのピクセルが実際に表示されるわけではないということです。もちろん、これは次の場合に機能しますSystemInformation.MonitorCount = 1

それでも私はこれに本当に満足していません。

4

2 に答える 2

5
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
于 2013-01-17T16:26:14.130 に答える
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);
    }
于 2013-01-17T21:28:20.353 に答える