Laden...

Wie wird der Text einer Forms TextBox gezeichnet?

Erstellt von ThePyramidOfDoom vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.325 Views
ThePyramidOfDoom Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren
Wie wird der Text einer Forms TextBox gezeichnet?

Ich frage mich wie der Text einer TextBox beim schreiben gezeichnet wird. Bei einer mehrzeiligen TextBox hat man ja schon fast einen kleinen TextEditor.

Mit welcher Methode wird der Text angezeigt?

Passiert das hier auch über DrawString?

16.806 Beiträge seit 2008
vor 4 Jahren

Du kannst Dir einfach den Quellcode anschauen:
WinForms TextBox.cs - Reference Source

ThePyramidOfDoom Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren

Ja, da war ich jetzt eben, genauer gesagt in TextBoxBase.cs.

Wie es aussieht wird der Text mit dem TextRenderer geschrieben.
Und diese Methode zeichnet per Draw auf WindowsGraphics.FromHdc.

Danke für den Tipp.

Andererseits kommt mir das nicht sehr performant vor.

4.931 Beiträge seit 2008
vor 4 Jahren

Das sieht man aber im .NET-Code nicht, da die meisten WinForms-Controls (wie TextBox) nur Wrapper der WinAPI-Controls sind.
Der Text wird z.B. einfach mittels UnsafeNativeMethods.SetWindowText(...) gesetzt (in Control.WindowText, welche von Control.Text intern aufgerufen wird) und dann intern von dem Control (bei der WM_PAINT-Message) gezeichnet.

In der WinAPI gibt es die GDI+ Funktion GdipDrawString, s.a. GDI+ Text Functions (welche auch von Graphics.DrawString aufgerufen wird) und wohl auch von den anderen WinAPI-Controls verwendet wird.

16.806 Beiträge seit 2008
vor 4 Jahren

Das sieht man aber im .NET-Code nicht, da die meisten WinForms-Controls (wie TextBox) nur Wrapper der WinAPI-Controls sind.

Du siehst aber alle relevanten Stellen der Frage bzgl. GDI - darum gings ja.

Andererseits kommt mir das nicht sehr performant vor.

Das kommt drauf an, was Du tun willst. Auch WinForms (ab .NET 2.0) respektive GDI+ hat eine Hardwarebeschleunigung (nur 2D); die aber nicht so effizient ist, wie diese von WPF (auch 3D).
Wenn Du Millionen von Controls auf Deiner UI darstellen willst, dann ist sowieso selbst zeichnen angesagt (und auch nur das, was auf dem Screen ist).

GDI+ ist aber selbst performant genug für sehr leistungsfähige CAD/CAM Anwendungen.

ThePyramidOfDoom Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren

Ich schreibe grad ein paar Controls als Übung.
Bin jetzt dabei ein NumericUpDown selbst zu schreiben.
Auch wenn ich noch Anfänger bin funktioniert meine NumericUpDown-Control schon sehr gut.

Mein Problem ist die Nummer selbst. Ich habe sie mit einem Label gezeichnet, das lässt sich nicht mit Select auswählen. Dann wollte ich eine Textbox nehmen, da sich dort der Text auswählen und editieren lässt. Aber das Select-Rectangle ist wieder in System-Color.

Wie ich gelesen habe, kann ich das Rectangle wohl ausblenden/überschreiben und mein eigenes Zeichnen. Da kam ich dann auf die Idee, das es eine Methode geben muss mit der Microsoft den Text in der TextBox geschrieben hat, so das dieser sich leicht auswählen lässt.

16.806 Beiträge seit 2008
vor 4 Jahren

Mach Dir bei sowas um Performance als letztes Gedanken....
Im Prinzip zeichnet man sowas einfach selbst.

Gibt auf GitHub und den anderen Verdächtigen genug Beispiele, dessen Quellcode Du Dir einfach anschauen und Dich inspirieren lassen kannst.

[Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)