2010-07-07 10 views
5

No estoy seguro de cuál es la mejor manera de usar gráficos: ¿debo adjuntar mis clases a la forma principal Paint event y luego hacer el dibujo, o es mejor llamarlo desde Overidden OnPaint void como ¿esta? Es decir, ¿Está bien para hacer eso así:C# WinForms - Preguntas sobre el método de pintura

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' no se va a compilar, a menos que sea una subclase de una clase que permita ser físicamente torturada;) – Thomas

+2

Aw @Thomas, podrías haber editado eso. – Lazarus

+1

Nah. Soy demasiado ingenioso para eso. (Además, recientemente me reprendieron por editar un error obvio de copiar/pegar en el código de alguien, pero esa no fue la razón por la que me abstuve de editar aquí.) – Thomas

Respuesta

6

Se recomienda que los controles tienen prioridad sobre los métodos On... en lugar de suscribirse a sus propios eventos.

Debe llamar al base.OnPaint para asegurarse de que el método Paint se active correctamente.

From MSDN:

El método OnPaint también permite clases derivadas para controlar el evento sin asociar un delegado. Esta es la técnica preferida para manejar el evento en una clase derivada.

Notas para los herederos Al reemplazar
OnPaint en una clase derivada, asegúrese de llamada al método OnPaint de la clase base para que los delegados registrados reciban el evento .

+0

por lo general, anulando OnPaint no es necesario disparar eventos Paint, así que base.OnPaint no es obligatorio. MSDN dice, pero no todo es seguir exactamente. De manera similar, usted anula OnBackgroundPaint y comenta base.OnBackgroundPaint NO base repintado el fondo - contra parpadeo. – serhio

+0

@serhio: la forma de evitar la pintura de fondo no es anular OnBackgroundPaint (ese es el método de fuerza bruta de la vieja escuela transferido desde Win32). En su lugar, debe establecer el estilo de control para incluir 'AllPaintingInWmPaint'. –

+0

De MSDN: 'Al anular OnPaintBackground en una clase derivada, no es necesario llamar a OnPaintBackground de la clase base. Http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaintbackground. aspx – serhio

3

Realmente no importa; ambos trabajan. Anular OnPaint podría ser ligeramente más rápido en teoría, pero no es una diferencia que alguien lo note. Microsoft recomienda anular OnPaint pero realmente no motiva esto.

Debe llamar al base.OnPaint porque este método invocará controladores asociados al evento Paint.