C# WinForm VerticalTextAlign

  • C#

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Petersilie.

    C# WinForm VerticalTextAlign

    Hallo Leute,

    gibt es eine möglichkeit einer Textbox VerticalAlignment zu geben?

    Bei einem Label ist es ContentAlignment, dort kann man dann z.B. auswählen TopLeft

    Das brauche ich auch für eine Textbox.

    Ich verwende momentan eine Resizable Textbox, was mir zwar einges erleichtert, aber wenn der Text oben Links ständig klebt, seht das auch schei*e aus.
    Gibt es ein Draw/Paint event der Textbox, womit ich das machen kann?

    Hier TextBox ohne AutoSize (findet man dann auch im Editor)
    Abgeleitet von hier

    C#-Quellcode

    1. using System.ComponentModel;
    2. using System.Windows.Forms;
    3. class SizableTextBox : TextBox
    4. {
    5. [Browsable(true)]
    6. [DefaultValue(true)]
    7. [EditorBrowsable(EditorBrowsableState.Always)]
    8. [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    9. public override bool AutoSize
    10. {
    11. get
    12. {
    13. return base.AutoSize;
    14. }
    15. set
    16. {
    17. base.AutoSize = value;
    18. }
    19. }
    20. }

    Petersilie schrieb:

    Gibt es ein Draw/Paint event der Textbox, womit ich das machen kann?


    Ja, klar. Musst aber den Style des Control ändern, -> auf UserPaint umstellen, dann wird das Paint-Event gefeuert. Dann musst du die Sub OnPaint überwschreiben.

    VB.NET-Quellcode

    1. Public Class MTB
    2. Inherits TextBox
    3. Sub New()
    4. BorderStyle = Windows.Forms.BorderStyle.None
    5. SetStyle(ControlStyles.UserPaint, True)
    6. End Sub
    7. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    8. MyBase.OnPaint(e)
    9. e.Graphics.FillRectangle(Brushes.Black, ClientRectangle)
    10. End Sub
    11. End Class


    Evtl. reicht dir die Property TextAlign schon aus.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „NoIde“ ()

    @NoIde
    Hi, erstmal danke.

    Ich bekomme es jetzt hin, dass der UserInput BottomLeft in der TextBox erscheint.
    Dabei habe ich allerdings folgende Probleme:
    Spoiler anzeigen
    (Siehe Bilder im Anhang)
    - Der Cursor (IBeam) wird natürlich immer noch TopLeft angezeigt (Beam.JPG)
    - Beim reingehen in die Textbox, verändert sich aufeinmal die Font (WrongFont.JPG)
    - nach dem Zeichnen ist natürlich der UserInput immer noch als Text Value in der Textbox (Value.JPG)

    Hier der Code welchen ich verwende:

    C#-Quellcode

    1. protected override void OnPaint(PaintEventArgs e)
    2. {
    3. e.Graphics.FillRectangle(new SolidBrush(this.BackColor), e.ClipRectangle);
    4. Rectangle origin = e.ClipRectangle;
    5. SizeF fontSize = e.Graphics.MeasureString(this.Text, this.Font);
    6. Point point = new Point(origin.Location.X, origin.Bottom-(int)fontSize.Height);
    7. Size size = new Size(origin.Width, (int)fontSize.Height);
    8. Rectangle destination = new Rectangle( point,size);
    9. e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), destination);
    10. base.OnPaint(e);
    11. }
    12. public SizableTextBox()
    13. {
    14. this.AutoSize = false;
    15. this.SetStyle(ControlStyles.UserPaint, true);
    16. }


    Aus den Beschriebenen Problemen, entferne ich mich von dieser Lösung und Suche mir eine Alternative.
    Par DrawString und OnPait event das Vertical Alignment zu machen, ist einfach zu umständlich/ fehlerhaft.


    Vermutlich werde ich ein Label über die Textbox setzen o.ä.
    Wenn jemand Vorschläge oder fertige Lösungen hat, freue ich mich natürlich sehr über diese.


    Bilder
    • Beam.JPG

      8,65 kB, 114×48, 714 mal angesehen
    • Value.JPG

      8,98 kB, 106×45, 715 mal angesehen
    • WrongFont.JPG

      8,73 kB, 127×48, 667 mal angesehen