47

画面上でフォームが最後に配置された場所に関するユーザーの設定を記憶するアプリケーションを開発しています。場合によっては、ユーザーはそれを 2 番目の画面に表示し、後で 2 番目の画面なしでアプリを起動します (フォームが画面外に表示される場合もあります)。また、ユーザーが解像度を変更して同様の効果が得られる場合もあります。

Form_Shown イベント ハンドラーでこのチェックを行うことを望んでいました。基本的に、フォームが完全に画面から外れているかどうかを判断して、再配置できるようにしたいと考えています。

何かアドバイス?

4

7 に答える 7

69

フォームが完全に画面に表示されているかどうかをこの関数で確認します。

public bool IsOnScreen( Form form )
{
   Screen[] screens = Screen.AllScreens;
   foreach( Screen screen in screens )
   {
      Rectangle formRectangle = new Rectangle( form.Left, form.Top, 
                                               form.Width, form.Height );

      if( screen.WorkingArea.Contains( formRectangle ) )
      {
         return true;
      }
   }

   return false;
}

画面上にある場合は、左上の点のみを確認します。

public bool IsOnScreen( Form form )
{
   Screen[] screens = Screen.AllScreens;
   foreach( Screen screen in screens )
   {
      Point formTopLeft = new Point( form.Left, form.Top );

      if( screen.WorkingArea.Contains( formTopLeft ) )
      {
         return true;
      }
   }

   return false;
}
于 2009-06-12T14:56:52.870 に答える
20

上記のすべてのソリューションを「IntersectsWith」メソッドおよびLINQ拡張機能と組み合わせると、簡単に言うと次のようになります。

public bool IsOnScreen(Form form) 
{
   // Create rectangle
   Rectangle formRectangle = new Rectangle(form.Left, form.Top, form.Width, form.Height); 

   // Test
   return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(formRectangle));
}
于 2012-07-25T17:45:40.213 に答える
10

Complete solution here (based on all answers). I have added a parameter MinPercentOnScreen where at least this % of pixels must be visible across all screens/displays. So if this returns false you will need to move the window's position back to default.

// Return True if a certain percent of a rectangle is shown across the total screen area of all monitors, otherwise return False.
public bool IsOnScreen(System.Drawing.Point RecLocation, System.Drawing.Size RecSize, double MinPercentOnScreen = 0.2)
{
    double PixelsVisible = 0;
    System.Drawing.Rectangle Rec = new System.Drawing.Rectangle(RecLocation, RecSize);

    foreach (Screen Scrn in Screen.AllScreens)
    {
        System.Drawing.Rectangle r = System.Drawing.Rectangle.Intersect(Rec, Scrn.WorkingArea);
        // intersect rectangle with screen
        if (r.Width != 0 & r.Height != 0)
        {
            PixelsVisible += (r.Width * r.Height);
            // tally visible pixels
        }
    }
    return PixelsVisible >= (Rec.Width * Rec.Height) * MinPercentOnScreen;
}

Implementation:

return IsOnScreen(this.Location, this.Size);
于 2015-04-13T00:52:24.243 に答える
4

古いスレッドですが、まだ役に立ちます!Cody と Andrija- コードをありがとう。いくつかの小さな調整を行う必要がありました。 screen.WorkingArea.Intersect(formRectangle); の代わりに。formRectangle.Intersect(screen.WorkingArea); を使用しました。Intersect() はそのオブジェクトを交差点に置き換えるためです。フォームが画面から完全に外れている場合、交点の後の formRectangle は (0,0,0,0) であり、Contains() は true を返します。したがって、true を返す前に、formRectangle の Top、Left、Width、および Height がすべて 0 でないかどうかも確認します。フォームの一部が画面上にある場合、コードは true を返し、画面上にない場合は false を返します。

于 2010-12-16T22:08:22.497 に答える
0

ウィンドウを配置する前に、画面の解像度を確認してください。これにより、実際に実行する前に、解像度の境界外に配置するかどうかを判断できます。

于 2009-06-12T14:57:51.043 に答える