2010-04-13 16 views
11

Estoy tratando de obtener de la línea # 1 a la línea # 2 en el siguiente código:Ni Invalidar() ni Refresh() invoca OnPaint()

using System; 
using System.Windows.Forms; 

namespace MyNameSpace 
{ 
    internal class MyTextBox : System.Windows.Forms.TextBox 
    { 
     protected override void OnEnabledChanged(EventArgs e) 
     { 
      base.OnEnabledChanged(e); 
      Invalidate(); // Line #1 - can get here 
      Refresh(); 
     } 

     protected override void OnPaint(PaintEventArgs e) 
     { 
      base.OnPaint(e); 
      System.Diagnostics.Debugger.Break(); // Line #2 - can't get here 
     } 
    } 
} 

Sin embargo, parece que Neiter Invalidate() ni Refresh() hacen que se invoque OnPaint (PaintEventArgs e). Dos preguntas:

  1. ¿Por qué no funciona?
  2. Si no se puede arreglar: solo quiero invocar OnPaint (PaintEventArgs e) para acceder al objeto e.Graphics, ¿hay alguna otra forma de hacerlo?

Respuesta

13

para anular el dibujo del control, debe establecer el estilo para ser UserPaint así:

this.SetStyle(ControlStyles.UserPaint, true); 

ver este para obtener más información:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle.aspx

UserPaint Si es verdadero, el control pinta en lugar del sistema operativo haciéndolo. Si es falso, el evento Paint no se genera. Este estilo solo se aplica a las clases derivadas del control .

+0

¡Muchas gracias, SLC! Estoy haciendo de esto la respuesta aceptada. – user181813

0
internal class MyTextBox : System.Windows.Forms.TextBox 
{ 
    public MyTextBox() 
    { 
     this.SetStyle(ControlStyles.UserPaint, true); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
    } 
} 
3

Editar: Después de leer el comentario de Chris estoy de acuerdo es probable que no use este.


Para responder a la otra parte de la pregunta, se puede obtener un objeto gráfico para un control arbitrario con:

Graphics g = panel1.CreateGraphics(); 

Pero al hacer eso, también son responsables de la limpieza para arriba por lo que la la forma correcta es:

using (Graphics g = this.CreateGraphics()) 
    { 
    // all your drawing here 
    } 
+0

Pero probablemente no debería hacer esto. Mira este enlace: http://www.bobpowell.net/creategraphics.htm –

Cuestiones relacionadas