2011-01-21 5 views
7

So come lavorare con l'oggetto di tipo Graphics (almeno sono in grado di eseguire il rendering delle immagini) ma lo faccio sempre passando l'oggetto grafico recuperato dal metodo OnPaint.Come ottenere manualmente l'istanza dell'oggetto Graphics in WinForms?

Vorrei visualizzare un'immagine quando l'app è aperta (ad es. Nel metodo Form_Load) ma non ho idea di come ottenere l'istanza dell'oggetto Graphics che potrei usare? Grazie

risposta

12

L'utilizzo dell'oggetto e.Graphics fornito da OnPaint() è il modo corretto di farlo. Verrà eseguito subito dopo il metodo OnLoad(). Il modulo non è ancora visibile in OnLoad.

Ottenere un oggetto grafico da Control.CreateGraphics() è supportato. Comunque, qualunque cosa tu possa disegnare con questo sarà spazzato via non appena il modulo si riporterà da solo. Che succede quando l'utente sposta un'altra finestra sul tuo (pre-Aero) o quando minimizza e ripristina o ridimensiona in altro modo la finestra. Usa sempre CreateGraphics durante l'animazione ad alta velocità.

2

Se si sta tentando di creare un oggetto Graphics dalla superficie del modulo, è possibile utilizzare this.CreateGraphics

Se si sta tentando di creare una nuova immagine, è può sempre inizializzare un Image e quindi chiamare Graphics.CreateGraphics.FromImage(YourImage) es.

Bitmap b = new Bitmap(100,100); 
var g = Graphics.CreateGraphics.FromImage(b); 

A questo punto, qualsiasi disegno eseguito sull'oggetto Graphics verrà disegnato sull'immagine.

0

E come si prevede di utilizzare l'oggetto Graphics ottenuto nell'evento Load?

Se si desidera dipingere qualcosa sullo schermo, è necessario essere nell'evento Paint, oppure verrà cancellato sulla vernice successiva.

Cosa si può fare: caricare un altro (semplice) modulo, con solo una foto, e nasconderlo quando viene caricato il modulo principale.

Poiché l'evento di caricamento probabilmente verrà eseguito sul thread dell'interfaccia utente. Chiama DoEvents per far apparire l'altro modulo.

0

Nessuna delle risposte precedenti ha funzionato per me. Ho trovato la soluzione Rajnikant Rajwadi efficace (vedere https://social.msdn.microsoft.com/Forums/vstudio/en-US/ce90eb80-3faf-4266-b6e3-0082191793f7/creation-of-graphics-object-in-wpf-user-control?forum=wpf)

Ecco una chiamata orribilmente condensata a Graphics.MeasureString(). (si prega di codice più responsabilmente)

SizeF sf = System.Drawing.Graphics.FromHwnd(new System.Windows.Interop.WindowInteropHelper(this).Handle).MeasureString("w", new Font(TheControl.FontFamily.ToString(), (float)TheControl.FontSize));