Laden...

OnPaint gezielt überschreiben

Erstellt von KRambo vor 19 Jahren Letzter Beitrag vor 19 Jahren 4.022 Views
K
KRambo Themenstarter:in
355 Beiträge seit 2004
vor 19 Jahren
OnPaint gezielt überschreiben

Hallo

hab da mal ne Frage und zwar hab ich ein Usercontrol (selber gemacht) und da sind ein paar Textboxen drin. Nun möchte ich bei einigen davon das OnPaint überschreiben, nur wie geht das genau? Dazu muss ich die Controls ja ableiten...?

L
667 Beiträge seit 2004
vor 19 Jahren


public class MySpecialPaintedTextBox : TextBox
{

  public MySpecialPaintedTextBox() : base();

  new private void OnPaint(object sender, PaintEventArgs e)
  {
      //Deine Implementierung
  }

  //....
}


Statt der Textboxen dann natürlich die neue Klasse benutzen. Im Form-Designer kannste den neuen Textbox-Typ über den Reiter Benutersteuerelemente auf dem Form oder einem anderen Usercontrol setzen.

"It is not wise to be wise" - Sun Tzu

K
KRambo Themenstarter:in
355 Beiträge seit 2004
vor 19 Jahren

Danke aber mein VS lässt den Code nicht ganz gelten:


public MySpecialPaintedTextBox() : base();

Meldung (beim Doppelpunkt):

; wird erwartet

Und dann kommt noch die Meldung:

Klasse, Struktur oder Schnittstellenmethode muss einen Rückgabetyp haben

S
58 Beiträge seit 2004
vor 19 Jahren

Original von Lynix

  
  
public class MySpecialPaintedTextBox : TextBox  
{  
  
  public MySpecialPaintedTextBox() : base(){}  
  
  new private void OnPaint(object sender, PaintEventArgs e)  
  {  
      //Deine Implementierung  
  }  
  
  //....  
}  
  
  

versuchs mal so

wer fehler findet, darf sie behalten

K
KRambo Themenstarter:in
355 Beiträge seit 2004
vor 19 Jahren

Jetzt funktionierts, danke euch 🙂

Nur eine Frage hab ich grad noch zu dem Thema:
Bei der Textbox gibts die Eigenschaft ClientRectangle. Ist dies der Innenbereich des Controls ohne oder mit Border (also dem Rahmen)??

D
279 Beiträge seit 2004
vor 19 Jahren

Hallo,

Der Clientbereich eines Steuerelements entspricht den Begrenzungen des Steuerelements abzüglich der Nicht-Clientelemente wie Bildlaufleisten, Rahmen, Titelleisten und Menüs.

Da die Clientkoordinaten relativ zur linken oberen Ecke des Clientbereichs des Steuerelements angegeben werden, sind die von dieser Eigenschaft zurückgegebenen Koordinaten für die linke obere Ecke des Rechtecks (0,0). Mit Hilfe dieser Eigenschaft können Sie Größe und Koordinaten des Clientbereichs des Steuerelements für Aufgaben wie das Zeichnen auf der Oberfläche des Steuerelements abrufen.

K
KRambo Themenstarter:in
355 Beiträge seit 2004
vor 19 Jahren

Hatte ich grad auch in der MSDN gefunden. Danke 🙂

K
KRambo Themenstarter:in
355 Beiträge seit 2004
vor 19 Jahren

Achja hab grad noch was:

Irgendwie lässt sich die OnPaint Methode zwar überschreiben, hat aber keine Auswirkungen auf das Steuerelement. Und zwar hab ich folgenden Code geschrieben:


protected override void OnPaint(PaintEventArgs e)
{
	// Hintergrund zeichnen
	SolidBrush brush = new SolidBrush(Color.White);
	e.Graphics.FillRectangle(brush,this.ClientRectangle);

	brush.Dispose();
}

Das ganze hat den Sinn, dass die Hintergrundfarbe der Textbox auch dann weiss sein soll, wenn sie auf Enabled = false ist. Nur wie gesagt funktioniert da noch was nicht richtig (kompilieren geht problemlos)...weiss evtl jemand was?

K
KRambo Themenstarter:in
355 Beiträge seit 2004
vor 19 Jahren

Hm ich glaube ich weiss auch warum, nur den Grund kenn ich nicht. Und zwar wenn ich beim von mir eingefügten OnPaint nen Haltepunkt reinmache und debugge, dann springt er da nie rein, also ruft er die Funktion nie auf.

Nur begreife ich nicht wieso. Normal sollte das Control doch OnPaint aufrufen, wenn es gezeichnet wird!? Kann doch nicht ganz sein...?

Na super:

Von den Steuerelementen, die vollständig von Windows gezeichnet werden, z. B. Textbox, wird die OnPaint-Methode nie aufgerufen.

Wieder Arschkarte gezogen 🙁

D
279 Beiträge seit 2004
vor 19 Jahren

Hallo,

füg mal folgenden Code zum Konstruktor deiner Klasse hinzu:


this.SetStyle(ControlStyles.UserPaint,true);


public class myTextBox : TextBox
	{
		public myTextBox()
		{
			//Das Steuerelement muss sich selbst zeichnen
			this.SetStyle(ControlStyles.UserPaint,true);
		}

		protected override void OnPaint(PaintEventArgs e)
		{
			//base.OnPaint (e);
			SolidBrush brush = new SolidBrush(Color.Blue);
			e.Graphics.FillRectangle(brush,this.ClientRectangle);
		}

	}

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo KRambo,

Du musst nicht OnPaint überschreiben, sondern einen PaintEventHandler in das Control.Paint-Ereignis eintragen. In diesen PaintEventHandler schreibst du dann den Code, den du jetzt in OnPaint stehen hast.

Das Control.Paint-Ereignis tritt ein, wenn das Steuerelement neu gezeichnet wird, wogegen OnPaint das Paint-Ereignis auslöst (was du aber nicht brauchst, weil das Windows für Dich macht; Sollte es nötig sein, das Zeichnen doch manuell anzustoßen, dann ist sowieso Control.Invalidate das Mittel der Wahl. OnPaint braucht man, wie ich das sehe, nie).

HTH

herbivore

K
KRambo Themenstarter:in
355 Beiträge seit 2004
vor 19 Jahren

OnPaint kann man eben gar nicht überschreiben, da das Control von Windows gezeichnet wird. Seht so in der MSDN. Man kann ein Flag setzen, dass man es selber zeichnen will wie Denny schon geschrieben hatte (habe ich auch in der MSDN gefunden). Aber komischerweise haut er mir dann das komplette Design der Komponente zusammen durch dieses OnPaint, weil ich irgendwie "über" die Controls einfach drüberzeichne (sind noch ein paar davor).

Alles in allem eine ziemlich wackelige Angelegenheit. Hat auch mit dem PaintEventHandler nicht funktioniert, da bekomme ich dasselbe Ergebnis wie beim OnPaint mit diesem Flag (SetStyle). Naja habs jetzt anders gelöst indem ich das ganze ohne OnPaint löse. Sind zwar paar kleine Bugs drin...wenn ichs schaffen würde, dass man in der Textbox nichts markieren kann, dann hätt ichs geschafft soweit....also so ne Art Enabled = false, nur dass die Textbox nicht grau wird...das ist mein Ziel...jemand n Tipp?

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo KRambo,

wenn man in der TextBox nichts markieren kann, sollte Sie auch so aussehen, als ob man nichts markieren kann. Du solltest die Farbe also so lassen, wie sie bei disabled eben ist.

Wenn Du die Farbe unbedingt so haben willst, wie ohne Enabled ist, geht das so:


TextBox tb = new TextBox ();
Color clr = tb.BackColor;
tb.Enabled = false;
tb.BackColor = clr;

HTH

herbivore

K
KRambo Themenstarter:in
355 Beiträge seit 2004
vor 19 Jahren

Hallo Herbivore

Ich weiss, ich möchte damit auch nicht vom Standard abweichen, sondern es hat schon seinen Sinn. Wenn ich vorher gewusst hätte, dass es so einfach geht...mann dann hätt ich mir den ganzen Aufwand sparen können. Vielen Dank 🙂