2013-01-17 19 views
18

È possibile creare un grande rettangolo bianco sullo schermo utilizzando solo la console C# e non un'applicazione di moduli C#?disegnare sullo schermo senza modulo

Dovrebbe coprire l'intero schermo, se possibile. So che devo usare System.Drawing e ho provato diversi passaggi, ma nessuno stamperà nulla sul mio schermo!

+1

Stai chiedendo un modo per disegnare al di fuori della finestra della console? – Tharwen

+0

@Tharwen yeah intendevo che – user1988147

risposta

38

Metodo 1: chiamare l'API di Windows

È necessario System.Drawing e System.Runtime.InteropServices. Potrebbe essere necessario aggiungere loro riferimenti al progetto.

using System.Runtime.InteropServices; 
using System.Drawing; 

Aggiungi i metodi per la classe con P/Invoke

[DllImport("User32.dll")] 
public static extern IntPtr GetDC(IntPtr hwnd); 
[DllImport("User32.dll")] 
public static extern void ReleaseDC(IntPtr hwnd, IntPtr dc); 

ottenere un oggetto Graphics per l'intero schermo e disegnare un rettangolo con esso:

IntPtr desktopPtr = GetDC(IntPtr.Zero); 
Graphics g = Graphics.FromHdc(desktopPtr); 

SolidBrush b = new SolidBrush(Color.White); 
g.FillRectangle(b, new Rectangle(0, 0, 1920, 1080)); 

g.Dispose(); 
ReleaseDC(IntPtr.Zero, desktopPtr); 

Il problema con questo il metodo è che se lo schermo si aggiorna, il rettangolo verrà sovrascritto, rendendolo inutilizzabile per la maggior parte delle applicazioni pratiche.

Metodo 2: Creare un modulo senza bordi

Come in precedenza, è necessario un riferimento di progetto. Questa volta per System.Windows.Forms. Avrete anche bisogno di System.Drawing ancora:

using System.Drawing; 
using System.Windows.Forms; 

rendere il nuovo modulo, rimuovere i suoi confini, riempire lo schermo con esso, e metterlo in cima alla barra delle applicazioni:

Form f = new Form(); 
f.BackColor = Color.White; 
f.FormBorderStyle = FormBorderStyle.None; 
f.Bounds = Screen.PrimaryScreen.Bounds; 
f.TopMost = true; 

Application.EnableVisualStyles(); 
Application.Run(f); 

un possibile problema con questo è che l'utente può solo alt + tab lontano dalla finestra. Se vuoi fare una grafica più complicata, dovrai scrivere un codice di disegno come this. Per rendere trasparente lo sfondo del modulo, impostare lo TransparentKey sullo stesso valore di Backolor.

Ho appena testato entrambi in .NET 4.5 e Windows 7, quindi potrebbe essere diverso per le versioni precedenti.Maggiori informazioni here e here.

+0

questo è quello che sto cercando – user1988147

+0

questo è veramente buono! – user1988147

5

Sì, è possibile disegnare sullo schermo ma potrebbe essere più semplice utilizzare una forma senza bordi.

È anche possibile eseguire questa operazione da un'applicazione console, se necessario, fornendo i riferimenti agli assembly necessari, ma ciò comporterebbe la permanenza sullo schermo di una finestra della console per la durata dell'applicazione.

this.TopMost = true; 
this.FormBorderStyle = FormBorderStyle.None; 

alternativa credo che si può creare un'istanza di Window e chiamare Show su questo.

This answer to a different question spiega come utilizzare le chiamate GDI + per disegnare direttamente sullo schermo.

+0

thx finora, ma volevo disegnare questo al di fuori della finestra della console – user1988147

2

Il modo in cui comprendo la domanda, non è davvero possibile in alcun modo significativo. Suppongo che potresti chiamare la piattaforma su user32.dll e gdi32.dll e implementare una classica applicazione per l'interfaccia utente di Windows in questo modo, con il loop dei messaggi e così via, ma sarebbe molto più semplice usare semplicemente Forms. Qual è la ragione per cui non puoi farlo?

+0

non capisco downvoters senza motivo, qual è il tuo problema persone? –

+2

Per me, questo dovrebbe essere un commento. È più una domanda che una risposta. –

Problemi correlati