2010-04-13 10 views
11

Próbuję dostać się z linii # 1 do # 2 linii w kodzie poniżej:Ani Invalidate() ani Refresh() wywołuje 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 
     } 
    } 
} 

Wydaje się jednak, że neiter Invalidate() ani Refresh() powoduje wywołanie OnPaint (PaintEventArgs e). Dwa pytania:

  1. Dlaczego to nie działa?
  2. Jeśli nie można go naprawić: chcę tylko wywołać OnPaint (PaintEventArgs e) w celu uzyskania dostępu do obiektu e.Graphics - czy jest jakiś inny sposób na zrobienie tego?

Odpowiedz

13

Aby zastąpić rysunek kontroli, należy ustawić styl do UserPaint tak:

this.SetStyle(ControlStyles.UserPaint, true); 

Zobacz to, aby uzyskać więcej informacji:

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

UserPaint Jeśli wartość jest prawdą, układ sterowania sam wykonuje operację, a nie działa jako działający system. W przypadku wartości false zdarzenie Paint nie zostanie wywołane. Ten styl dotyczy tylko klas pochodzących z .

+0

Wielkie dzięki, SLC! Robię to jako zaakceptowaną odpowiedź. – 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

Edycja: Po przeczytaniu komentarza Chrisa zgadzam prawdopodobnie nie powinni stosować tego produktu.


Aby odpowiedzieć na drugą część pytania, można dostać obiekt graficzny dla dowolnego sterowania z:

Graphics g = panel1.CreateGraphics(); 

Ale kiedy robi, że jesteś odpowiedzialny za czyszczenie go więc poprawna forma to:

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

Ale prawdopodobnie nie należy tego robić. Sprawdź ten link: http://www.bobpowell.net/creategraphics.htm –

Powiązane problemy