2009-06-12 17 views
29

フォームが画面上で最後にどこに配置されたかについてユーザーの設定を記憶するアプリケーションを開発しています。場合によっては、ユーザーはセカンダリ画面でそれを持っていて、後で2番目の画面を表示せずにアプリケーションを起動します(フォームが画面外に表示されることもあります)。それ以外の場合は、ユーザーが解像度を変更して同様の効果が得られます。フォームが完全に画面から外れているかどうかを確認する

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

アドバイスはありますか?この機能を持つ

+0

私は、私は、フォームの画面解像度、サイズと位置を取得することにより、いくつかのトリッキーなロジックを実行することができます承知していることを言及する必要がありますが、私は少し何かを期待していましたよりエレガント。 – Cody

+0

あなたは本当にそのフォームを配置するよりエレガントだと思って、解像度/サイズの外にあるかどうかを確認して、それを再配置しますか?より洗練されたソリューションは、あなたが行う前にあなたがスクリーンから離れているかどうかを確認することです。 –

答えて

49

確認フォームが完全に画面上の場合:

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; 
} 
+0

Form rectangleを他の方法で取得する方法を忘れていましたが、これが役立つことを願っています。 –

+0

これは本当にきれいに見えますが、その機能が存在するかどうかはわかりませんでした。しかし、1つの質問:ウィンドウが部分的に画面から外れている場合でもそれはまだfalseを返しますか?この質問は完全にオフスクリーンであることを求めている。 –

+0

はい、実際には... –

0

があなたの位置の前の画面解像度を確認してください:それは、画面上にある場合

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; 
} 

のみ左上のポイントをチェック窓。そうすれば、実際に行う前に、解像度の範囲外にどこに配置するかを判断することができます。

3

古いスレッドですが、まだ役立ちます! コーディと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を返します。 "IntersectsWith" -methodとLINQ-拡張子を持つ上記のすべてのソリューションを組み合わせる

+1

ありがとうSean!完全な答えを得るためにこの答えをAndrija'sに組み込むことができる方法はありますか? – Cody

12

は、短期的に私たちを与える:

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)); 
} 
+0

['Form.ClientRectangle'](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.clientrectangle.aspx)を使用してこれをさらに簡略化することはできませんでした – Carsten

+1

ほとんどの目的のために、それは全体の形を含んでいませんが。 MSDNのControl.ClientRectangle: "コントロールのクライアント領域は、スクロールバー、枠線、タイトルバー、メニューなどの非クライアント要素を除いたコントロールの境界です。 (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.clientrectangle.aspx) –

+1

['Form.DesktopBounds'](http://msdn.microsoft .com/en-us/library/system.windows.forms.form.desktopbounds(v = vs.110).aspx) – Dan

1

WPFについて

は、参照を追加します(マティアスLoerkesの回答に基づいて) System.Windows.FormsおよびSystem.Drawing

//using System.Windows.Forms; 

public bool IsOnScreen(Window window) 
{ 
    var windowRect = new System.Drawing.Rectangle((int)window.Left, (int)window.Top, (int)window.Width, (int)window.Height); 
    return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(windowRect)); 
} 
8

完全解答(すべての回答に基づく)。私はすべての画面/ディスプレイで少なくともこの%のピクセルを表示する必要があるパラメータMinPercentOnScreenを追加しました。したがって、これがfalseを返す場合は、ウィンドウの位置をデフォルトに戻す必要があります。

// 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; 
} 

実装:

return IsOnScreen(this.Location, this.Size); 
関連する問題