2010-04-13 14 views
11

Ich versuche, von Zeile # 1 bis Linie 2 in den folgenden Code zu erhalten:Weder Invalidate() noch Refresh() ruft 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 
     } 
    } 
} 

Allerdings scheint es, dass Neiter Invalidate() noch Refresh() bewirkt, dass OnPaint (PaintEventArgs e) aufgerufen wird. Zwei Fragen:

  1. Warum funktioniert es nicht?
  2. Wenn es nicht behoben werden kann: Ich möchte OnPaint (PaintEventArgs e) nur aufrufen, um auf das e.Graphics-Objekt zuzugreifen - gibt es eine andere Möglichkeit, dies zu tun?

Antwort

13

die Zeichnung der Steuerung außer Kraft zu setzen, können Sie den Stil festlegen müssen so sein UserPaint:

this.SetStyle(ControlStyles.UserPaint, true); 

diese mehr Informationen für Siehe:

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

UserPaint Wenn dies der Fall ist, zeichnet die Steuerung selbst und nicht das Betriebssystem . Wenn false, wird das Ereignis Paint nicht ausgelöst. Dieser Stil nur gilt für Klassen, die von Control abgeleitet sind.

+0

Vielen Dank, SLC! Ich mache das zur akzeptierten Antwort. – 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

Edit: Nachdem Chris Kommentar zu lesen Ich bin damit einverstanden, sollten Sie wahrscheinlich nicht dieses verwenden.


Um den anderen Teil der Frage zu beantworten, Sie ein Grafik-Objekt für eine beliebige Steuerung mit bekommen:

Graphics g = panel1.CreateGraphics(); 

Aber das, wenn tun, sind Sie auch dafür, so die Reinigung verantwortlich bis die korrekte Form ist:

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

Aber sollte das wahrscheinlich nicht tun. Überprüfen Sie diesen Link: http://www.bobpowell.net/creategraphics.htm –

Verwandte Themen