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?
Du kannst Dir einfach den Quellcode anschauen:
WinForms TextBox.cs - Reference Source
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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)
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code