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...?
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
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
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
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)??
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.
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?
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 🙁
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);
}
}
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
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?
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
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 🙂