2013-01-17 16 views
6

Sto tentando di elaborare se il modulo completo è visibile sullo schermo. Per chiarire questo: non mi interessa se la forma è parzialmente o completamente nascosta da un'altra forma, voglio solo sapere se il modulo è completamente sullo schermo.Verifica se il modulo è limitato a tutte le schermate

In Windows è possibile spostare le forme in giro, in modo tale che essi sono nascosti a metà strada. Questo perché è possibile spostarli oltre i limiti effettivi di qualsiasi monitor. (Più a sinistra, a destra o in basso.) Come posso verificare se questo è il caso in un modo semplice?

Quello che ho capito che potevo fare è quello di verificare se il modulo è in limiti della SystemInformation.VirtualScreen. Il problema qui è che non tutti i pixel dello schermo virtuale sono effettivamente visibili. Naturalmente questo funzionerebbe se SystemInformation.MonitorCount = 1

Ancora io non sono molto contento di questo.

risposta

3

Il modo migliore che posso pensare è che si controlla che tutti e quattro gli angoli del modulo sono su uno schermo. In questo modo:

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

Ok, devo solo costruire un esempio oscuro qui. Immagina tre monitor allineati uno accanto all'altra, ciascuno largo 800 px. I monitor 1 e 3 sono alti 600 px, il monitor 2 (quello centrale) è alto 400 px. Lo spazio virtuale dello schermo sarebbe 1800px * 600px. Se il monitor 2 fosse allineato sulla parte superiore degli altri monitor, allora ci sarebbe 200 px sul fondo dello spazio virtuale dello schermo che non sarebbe visibile. Ora potrei estendere una finestra dal monitor 1 al monitor 3 e l'intero modulo non sarebbe visibile, il fondo sarebbe perso sul monitor 2. –

+2

Bene, avrai bisogno di scrivere molto più codice per gestire un caso del genere. Buona fortuna con esso. –

+0

Lo so, era solo un esempio molto costruito. Spero che non arriverà mai a quello. –

4
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 
+3

Perché sulla Terra usi DoEvents? –

+0

Restituisce 'False' se la finestra è ingrandita. – CrazyTim

Problemi correlati