TextBox mit runden Ecken

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von this.Update().

    TextBox mit runden Ecken

    Ich versuche mich zur Zeit an eigenen User-Controls. Für ein größeres Projekt bräuchte ich eine Textbox mit runden Ecken (ungefähr so wie von Mac OSX [ich weis, da gibts schon was hier im Forum, allerdings funktioniert das bei mir nicht]). Hier führ hab ich mir erstmal ein UserControl-Element erstellt und eine TextBox mit Border-Style "null" hinzugefügt und ein wenig herumgespielt. Leider gibt es im Internet und auch hier im Forum so gut wie gar keine Anleitungen wie man denn sowas macht, meistens nur schon fertige Controls.
    Ungefähr so? dead link/404 an dieser Stelle entfernt ~VaporiZed
    Ich könnte Dir auch gerne meine Controls zu Verfügung stellen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hi,

    vielen Dank für die schnelle Hilfe.

    @Gonger96:

    Jop, ist mir klar. Im OnPaint-Event hab ich schon ein bisschen rumgespielt, nur leider ändert sich die Border der TextBox nicht. Muss ich da eine neue Region erstellen?

    @Seruz

    Das sieht ja mal richtig genial aus! Aber ich würd gern was eigenes machen :)

    Über jede Art von Anleitung würde ich mich sehr freuen!
    Vollzitat eines Vorposts an dieser Stelle entfernt ~VaporiZed

    Ich hatte damals dieses Video hier genutzt: dead link/404 an dieser Stelle entfernt ~VaporiZed
    Es hatte mir sehr geholfen, damals noch als ,,Anfänger".
    Viel Glück!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Du könntest natürlich auch mit TextBox.Region rumspielen hier ein kleines Beispiel :

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. abrunden(1, 1, TextBox1.Width - 2, TextBox1.Height - 2, 10, TextBox1)
    4. End Sub
    5. Sub abrunden(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal radius As Integer, ByVal textbox As TextBox)
    6. Dim gp As System.Drawing.Drawing2D.GraphicsPath = New System.Drawing.Drawing2D.GraphicsPath()
    7. gp.AddLine(x + radius, y, x + width - radius, y)
    8. gp.AddArc(x + width - radius, y, radius, radius, 270, 90)
    9. gp.AddLine(x + width, y + radius, x + width, y + height - radius)
    10. gp.AddArc(x + width - radius, y + height - radius, radius, radius, 0, 90)
    11. gp.AddLine(x + width - radius, y + height, x + radius, y + height)
    12. gp.AddArc(x, y + height - radius, radius, radius, 90, 90)
    13. gp.AddLine(x, y + height - radius, x, y + radius)
    14. gp.AddArc(x, y, radius, radius, 180, 90)
    15. gp.CloseFigure()
    16. textbox.Region = New System.Drawing.Region(gp)
    17. gp.Dispose()
    18. End Sub
    19. End Class

    ist auf jeden fall ganz schön anzusehen :) und du brauchst kein extra control :)
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BlackNetworkBit“ ()

    Hier der Downloadlink + die ganzen Codes:


    Vielen Dank, aber soweit ich das sehe zeichnest du die Form gar nicht selber sondern benutzt einfach ein Bild, oder?

    Du könntest natürlich auch mit TextBox.Region rumspielen hier ein kleines Beispiel :


    Sorry aber das gefällt mir nicht so
    Beim Erstellen eines eigenen Controls kann man ja auch von TextBox erben und dann im Paint-Event bzw. der OnPaint-Methode, das zeichnen. Und das OnPaint ist kein Event ;)

    Oder ich sag es mal wieder: WPF verwenden. Windows Forms ist afaik über 15 Jahre alt. Da ist Windows Presentation Foundation einfach eine neue Technologie, mit der sowas sehr einfach machbar ist, da es alles nötige mitliefert und für dynamische Layouts kreiert wurde.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Du kannst per Region eine Maske erstellen also wenn das dir nicht gefällt dann mache dir doch einfach eine eigene Maske :)
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Wieso sollte man das? Man mischt WinForms nicht mit WPF. Wenn du schon WPF verwenden würdest, dann natürlich für alles.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hm ok. Das käme jetzt drauf an, wie weit du schon bist und ob sich das noch lohnt. Na dann mach es dieses mal über GDI+, aber überleg es dir mal mit WPF anzufangen ;)

    Das mit den Regions kannst du doch mal versuchen, oder schau dir mal ein wenig DrawArc usw an.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Dafür ist WPF überflüssig. Für eine blöde Textbox muss man nicht das ganze Programm mit WPF rendern. Ich find sowas sowieso unnötig da es Nutzer überhaupt nicht interressiert. Naja du nimmst dir eine Klasse, erbst von Textbox. Danach kannst du die Flags UserPaint setzen per Setstyle()-Methode glaub ich und alles im Paint Event oder OnPaint malen. So kannst du einfach per GDI+ deine abgerundeteten Ecken malen.

    Was Regions angeht, die sind immer schrecklich verpixelt. Sowas sieht ziemlich unschön aus
    Jo, das mit dem SetStyle() kommt in den Konstruktor. Das hier ist Optimal:

    VB.NET-Quellcode

    1. Public Sub New()
    2. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw, True)
    3. UpdateStyles()
    4. End Sub
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: