15

WinFormが画面に完全に表示されていることを確認する方法はありますか(たとえば、画面の範囲外ではありませんか?)

これにSystemInformation.VirtualScreenを使用してみました。これは、仮想画面が長方形である限りうまく機能しますが、そうでない場合(たとえば、L字型の3つの画面)、SystemInformation.VirtualScreenは、すべてを含む最小の長方形を返します。表示されているピクセル(仮想画面にあるにもかかわらず、Lの右上隅のウィンドウは表示されません)


私がこれを達成しようとしている理由は、プログラムが最後にあった場所で子ウィンドウを開きたいのですが、ユーザーが設定を変更した場合にそれらのウィンドウが表示されないようにしたくないからです(たとえば、ラップトップから余分な画面を取り外します)

4

5 に答える 5

12

これが私が最終的にそれをした方法です:

bool isPointVisibleOnAScreen(Point p)
{
    foreach (Screen s in Screen.AllScreens)
    {
        if (p.X < s.Bounds.Right && p.X > s.Bounds.Left && p.Y > s.Bounds.Top && p.Y < s.Bounds.Bottom)
            return true;
    }
    return false;
}

bool isFormFullyVisible(Form f)
{
    return isPointVisibleOnAScreen(new Point(f.Left, f.Top)) && isPointVisibleOnAScreen(new Point(f.Right, f.Top)) && isPointVisibleOnAScreen(new Point(f.Left, f.Bottom)) && isPointVisibleOnAScreen(new Point(f.Right, f.Bottom));
 }

ユーザーのディスプレイ設定に「穴」がある場合、誤検知が発生する可能性があります (以下の例を参照)。

   [1]
[2][X][3]
于 2011-07-18T09:11:15.443 に答える
6

これが私がそれを行う方法です:

これにより、表示境界内のコントロール (フォーム) が元の位置にできるだけ近く移動します。

    private void EnsureVisible(Control ctrl)
    {
        Rectangle ctrlRect = ctrl.DisplayRectangle; //The dimensions of the ctrl
        ctrlRect.Y = ctrl.Top; //Add in the real Top and Left Vals
        ctrlRect.X = ctrl.Left;
        Rectangle screenRect = Screen.GetWorkingArea(ctrl); //The Working Area fo the screen showing most of the Ctrl

        //Now tweak the ctrl's Top and Left until it's fully visible. 
        ctrl.Left += Math.Min(0, screenRect.Left + screenRect.Width - ctrl.Left - ctrl.Width);
        ctrl.Left -= Math.Min(0, ctrl.Left - screenRect.Left);
        ctrl.Top += Math.Min(0, screenRect.Top + screenRect.Height - ctrl.Top - ctrl.Height);
        ctrl.Top -= Math.Min(0, ctrl.Top - screenRect.Top);

    }

もちろん、コントロールを移動する代わりに元の質問に答えるには、4 つの Math.Min のいずれかが 0 以外の値を返したかどうかを確認できます。

于 2011-07-06T04:54:18.540 に答える
2

かどうか確かめるScreen.AllScreens.Any(s => s.WorkingArea.Contains(rect))

于 2011-07-06T02:59:40.127 に答える