2010-07-07 12 views
5

Non sono sicuro di quale sia il modo migliore di utilizzare la grafica: devo associare le mie classi all'evento Paint principale e quindi fare il disegno, oppure è meglio chiamarlo da overPaint vuoto come Questo? Voglio dire, è ok per farlo in questo modo:C# WinForms - Domande sui metodi di pittura

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e) //what is this good for? My app works without it as well 
    Graphics g=e.Graphics; 
    DrawEnemies(g); 
    UpdateHUD(g); 
    DrawSelectedUnit(g); 
} 
+4

'OnPain' non verrà compilato, a meno che questa non sia in realtà una sottoclasse di una classe che supporta l'essere fisicamente torturata;) – Thomas

+2

Aw @Thomas, potresti averlo appena modificato. – Lazarus

+1

Nah. Sono troppo spiritoso per quello. (Inoltre, sono stato recentemente rimproverato per aver modificato un errore evidente di copia/incolla nel codice di qualcuno, ma non era questa la ragione per cui mi sono astenuto dal modificare qui.) – Thomas

risposta

6

Si raccomanda che i controlli hanno la priorità sulle On... metodi piuttosto che sottoscrivere i propri eventi.

Si dovrebbe chiamare base.OnPaint per garantire il metodo Paint è sparato in modo corretto.

From MSDN:

Il metodo OnPaint consente inoltre classi derivate di gestire l'evento senza associare un delegato. Questa è la la tecnica preferita per gestire l'evento in una classe derivata.

Note sull'ereditarietà
Quando si esegue l'override OnPaint in una classe derivata, assicurarsi di chiamata al metodo OnPaint della classe base in modo che i delegati registrati ricevano l'evento.

+0

in genere, ignorando OnPaint non è necessario attivare gli eventi Paint, quindi base.OnPaint non è obbligatorio. MSDN dice, ma non tutto deve seguire esattamente. Analogamente, si esegue l'override di OnBackgroundPaint e si commenta la base.OnBackgroundPaint NON basa il ridisegno dello sfondo - contro lo sfarfallio. – serhio

+0

@serhio: il modo per prevenire la pittura di sfondo non è quello di sovrascrivere OnBackgroundPaint (è il metodo della forza bruta vecchia scuola riportato da Win32). Invece, dovresti impostare lo stile di controllo per includere 'AllPaintingInWmPaint'. –

+0

Da MSDN: 'Quando si esegue l'override di OnPaintBackground in una classe derivata, non è necessario chiamare l'OnPaintBackground della classe base. Http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaintbackground. aspx – serhio

3

Non importa; entrambi funzionano L'override di OnPaint potrebbe essere leggermente più veloce in teoria, ma non è una differenza che nessuno noterà. Microsoft consiglia di ignorare lo OnPaint ma in realtà non lo motiva.

avete bisogno di chiamare base.OnPaint perché questo metodo invocherà i gestori collegati all'evento Paint.