تحديد ما إذا كان النموذج هو تماما خارج الشاشة

StackOverflow https://stackoverflow.com/questions/987018

  •  13-09-2019
  •  | 
  •  

سؤال

أقوم بتطوير تطبيق يتذكر تفضيلات المستخدم فيما يتعلق بمكان آخر النموذج الموجود في الشاشة. في بعض الحالات، سيكون لدى المستخدم على شاشة ثانوية، ثم قم بإطلاق التطبيق لاحقا بدون الشاشة الثانية (أحيانا يحتوي على النموذج على الشاشة). في أوقات أخرى سوف يقوم المستخدم بتغيير حلها مما يؤدي إلى تأثير مماثل.

كنت آمل أن أفعل هذا التحقق في معالج الأحداث Form_Shown. أساسا أريد تحديد ما إذا كان النموذج خارج الشاشة تماما حتى أتمكن من إعادة وضعه.

اي نصيحه؟

هل كانت مفيدة؟

المحلول

تحقق مع هذه الوظيفة إذا كان النموذج تماما على الشاشة:

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

نصائح أخرى

الجمع بين جميع الحلول المذكورة أعلاه مع "intersectswith" - method و linq-extensions تعطينا باختصار:

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

حل كامل هنا (بناء على جميع الإجابات). لقد أضافت معلمة 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);

موضوع قديم، ولكن لا يزال مفيدا! كودي وأندريجا - شكرا لك على الكود. اضطررت إلى إجراء تعديلات طفيفة: بدلا من الشاشة .workingarea.intersect (FormRectoangle)؛ لقد استخدمت FormRectangle.intersect (screen.workingarea)؛ نظرا لأن التقاطع () يحل محل كائنه بالتقاطع. إذا كان النموذج خارج الشاشة تماما، فستكون FormRectangle بعد التقاطع (0،0،0،0)، ويحتوي () إرجاع True. لذلك أتحقق أيضا لمعرفة ما إذا كان Top FormRectangle Top، Left، العرض والارتفاع ليس كله 0 قبل العودة إليه. الآن إرجاع التعليمات البرمجية TRUE إذا كان أي جزء من النموذج على الشاشة، و False إذا لم يكن أي جزء على الشاشة.

ل WPF. (بناء على إجابة Matthias Leerkes)

أضف إشارة إلى 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));
}

لا شيء من هذه العمل إذا حدث مراقب. ستقوم الشاشة. جميع الوظائف بإرجاع دائما عدد الشاشات حتى إذا كان أحد إيقاف التشغيل.

تحقق من حل الشاشات قبل وضع النافذة. سيسمح لك ذلك بمعرفة ما إذا كنت ستقوم به خارج حدود القرار، قبل أن تفعل ذلك بالفعل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top