Eigene Checkbox erstellen

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Luftpost.

    Eigene Checkbox erstellen

    Hallo und Guten Morgen bzw. für andere noch Abend :D

    Ich habe folgende Frage:

    Wie kann Ich eine eigene Checkbox erstellen wie man es bereits von Tutorials kennt in dem man einen eigenen Button erstellen kann...?

    Gibt es da auch etwas für die Checkbox?
    Habe mir extra 2 Bilder gemacht die ich dafür verwenden will... :)

    Ich habe auch gelesen man kann die Boxen auch Zeichnen lassen allerdings wüsste ich nicht wie ich das hinbekommen könnte wenn dazu 2 Bilder habe die ich dafür extra verwenden möchte :)

    Oder gibt es dazu eine einfach und Logische Methode die unkompliziert zur verfügung steht?

    Wäre euch sehr Dankbar wenn ihr mir da eventuell sagen könnt wie ich das bewerkstelleigen kann :)

    Beispiele wären auch nicht schlecht :D
    Oder eine art Tutorial...

    PS: hab mal 2 Bilder mit angehängt damit ihr wisst was Ich vorhabe :)

    MfG

    Luftpost
    Bilder
    • Checkbox_Blue_Checked.png

      2,85 kB, 13×13, 1.223 mal angesehen
    • Checkbox_Blue_Unchecked.png

      2,93 kB, 13×13, 1.249 mal angesehen
    Eine Normale Checkbox geht so:

    VB.NET-Quellcode

    1. Dim box As Checkbox
    2. With box
    3. .Text = "Dein Text"
    4. 'Das aussehen
    5. End With

    Nicht Getestet
    oder du machst das ganze mit GDI+ da du ja schatten haben will were GDI+ dafür meines wissens nach geeignet

    Erstell Dir ne neue Klasse. Lass diese Klasse von CheckBox erben. Überschreib die OnPaint()-Sub und übernimm das zeichnen der CheckBox selber. Du kannst Deine Images, so wie sie sind, mit dem in der OnPaint-Sub vorhandenen Graphics-Object, zeichnen.

    VB.NET-Quellcode

    1. Protected Overrides Sub OnPaint(pevent As System.Windows.Forms.PaintEventArgs)
    2. 'Hier zeichnen
    3. End Sub


    Das pevent-Object gibt Dir auch das "ClipRectangle" mit an die Hand. Probiers aus, so schwer ists nicht.
    Bilder
    • Unbenannt.PNG

      19,81 kB, 398×109, 219 mal angesehen
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

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

    Oder Du packst die fertigen Bilder in die Ressource und malst sie bei Paint an die richtige Position.
    Beachte:
    Deine Bilder sind verwirrend, denn mit einer solchen Darstellung sich Chrcked und Unchecked nicht intuitiv zu erfassen, das sieht eher nach Enable und Disable aus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke Danke Danke :)

    @SpaceyX
    Müsste Ich da nicht ein Public Sub New() erstellen?
    Zuminestens ist das bei dem Button so :)

    Mit dem Zeichnen ansich hab ich noch nicht soviel am Hut so das ich mir das jetzt nicht genau vorstellen kann wie es ungefähr aussehen könnte :)

    Aber dennoch vorerst schon mal ein Riesen Dank :)

    @RodFromGermany
    Weder noch :)
    Achte mal auf verschiedene Designs von WinXP, Vista und Co ^^
    Da sind viele auch genauso gestaltet und verwirren keineswegs :)

    Im ersten Moment scheint es wie du schon sagtest etwas Verwirrend aber wenn man es genauer betrachtet weiss man das es Uncheck und Check ist statt Enable und Disable :D

    MfG

    LuftPost

    xtts02 schrieb:

    Bin mir nicht ganz sicher, was der TE erreichen will. Eventuell einfach nur den unbestimmten Zustand aktivieren, der genau so aussieht wie auf dem Bild. In diesem Fall einfach den ThreeState auf True setzen.


    Na das steht doch oben da :D

    Also wenn Ich ClipRectangle verwenden will/möchte steht aber da das es ReadOnly ist somit kann ich dem garnichts zuweisen :O
    Moin,

    einfach ausprobieren, so wie ich es geschrieben hab. Rod hat Recht, pack Dir die beiden Bilder in die Ressourcen des Projekts. Wie man eine Klasse von einer anderen erben lässt, ist Dir bekannt?

    EDIT:

    Mit

    VB.NET-Quellcode

    1. pevent.Graphics


    zeichnest Du. Das ClipRectangle ist das Rechteck, dass die Checkbox einnimmt. Das sollst Du ja auch nicht verändern, sondern das gibt Dir die Werte, die Du brauchen kannst.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    xtts02 schrieb:

    Ich kann in deiner Fragen nicht ablesen, dass du das Aussehen vom unbekannten Zustand für den aktivierten Zustand verwenden willst.
    Sinn und Zweck ist mir jetzt immer noch nicht klar, denn bei falscher Verwendung könnte Missverständnis (Fehlinterpretation durch Anwender) auftreten.


    Er will doch einfach mit seinen hübschen Bildchen eine CheckBox machen. Von der ThreeState-Eigenschaft dieses Controls hat er wahrscheinlich noch nicht mal was gehört. Und mir ist noch keine Anwendung unter gekommen, die diese Eigenschaft verwendet. Meist ist es doch so, entweder an oder aus. Das ein Anwender den "Checked-Zustand" als Intermediate interpretieren kann, war doch nicht seine Absicht. Man muss nicht immer aus Allem ne Wissenschaft machen, auch wenn Du ja Recht hast und ich Dir auch Recht gebe. Er ist jetzt darauf hingewiesen, dass es einen Zwischenzustand gibt und kanns ja mit einem zusätzlichen Bild, das eindeutig ist, nachbessern.

    EDIT: Happy Birthday xtts02, falls Dein Geburtsdatum hier stimmt :)
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

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

    Auch von Mir sofern Korrekt ein Happy Birthsday @xtts02 :)

    So ich hab es schon mal geschafft :)

    Allerdings bekomm ich dann den Text nicht genau da hin positioniert wie in der Originalen CheckBox bzw. wie in deinem Beispiel oben @SpaceyX

    Nein ThreeState ist/war mir bis eben noch Unbekannt :O

    Bin ja auch recht neu in der Materie :D
    Bilder
    • Test.png

      14,78 kB, 221×108, 803 mal angesehen
    Oh, schön :) Dann geb ich Dir noch nen Tip. Du kannst auch .DrawString() nutzen und die Position anpassen. Aber beherzige auch, was xtts02 gesagt hat. Entwirf ein Bild für den Intermediate-Zusatand, ist schon wichtig!
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    So hier nochmal das Test-Ergebnis :)

    Denke das Ihr mit dem ThreeState das gemeint hattet siehe Bild :)

    Und Hier mal mein Code :)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Public Class CheckBox
    3. Inherits Windows.Forms.CheckBox
    4. Public Sub New()
    5. Checked = False
    6. End Sub
    7. Protected Overrides Sub OnPaint(pevent As System.Windows.Forms.PaintEventArgs)
    8. MyBase.OnPaint(pevent)
    9. With pevent
    10. If Me.ThreeState = True Then
    11. If CheckState = Windows.Forms.CheckState.Checked Then
    12. .Graphics.DrawImage(My.Resources.Checkbox_Blue_Checked, New Point(0, 0))
    13. End If
    14. If CheckState = Windows.Forms.CheckState.Indeterminate Then
    15. .Graphics.DrawImage(My.Resources.Checkbox_Blue_Indeterminate, New Point(0, 0))
    16. End If
    17. If CheckState = Windows.Forms.CheckState.Unchecked Then
    18. .Graphics.DrawImage(My.Resources.Checkbox_Blue_Unchecked, New Point(0, 0))
    19. End If
    20. ElseIf Me.ThreeState = False Then
    21. If CheckState = Windows.Forms.CheckState.Checked Or Checked = True Then
    22. .Graphics.DrawImage(My.Resources.Checkbox_Blue_Checked, New Point(0, 0))
    23. End If
    24. If CheckState = Windows.Forms.CheckState.Unchecked Or Checked = False Then
    25. .Graphics.DrawImage(My.Resources.Checkbox_Blue_Unchecked, New Point(0, 0))
    26. End If
    27. End If
    28. End With
    29. End Sub
    30. End Class
    Bilder
    • Test.png

      11,55 kB, 165×138, 1.018 mal angesehen

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

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Public Class CheckBox
    3. Inherits Windows.Forms.CheckBox
    4. Public Sub New()
    5. Checked = False
    6. End Sub
    7. Protected Overrides Sub OnPaint(ByVal pevent As System.Windows.Forms.PaintEventArgs)
    8. MyBase.OnPaint(pevent)
    9. With pevent
    10. Select Case CheckState
    11. Case Windows.Forms.CheckState.Checked
    12. .Graphics.DrawImage(My.Resources.Checkbox_Blue_Checked, New Point(0, 0))
    13. Case Windows.Forms.CheckState.Indeterminate
    14. .Graphics.DrawImage(My.Resources.Checkbox_Blue_Indeterminate, New Point(0, 0))
    15. Case Windows.Forms.CheckState.Unchecked
    16. .Graphics.DrawImage(My.Resources.Checkbox_Blue_Unchecked, New Point(0, 0))
    17. End Select
    18. End With
    19. End Sub
    20. End Class


    oder noch knapper:

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Public Class CheckBox
    3. Inherits Windows.Forms.CheckBox
    4. Dim images As Bitmap() = New Bitmap() {My.Resources.Checkbox_Blue_Unchecked, My.Resources.Checkbox_Blue_Checked, My.Resources.Checkbox_Blue_Indeterminate}
    5. Protected Overrides Sub OnPaint(ByVal pevent As System.Windows.Forms.PaintEventArgs)
    6. MyBase.OnPaint(pevent)
    7. pevent.Graphics.DrawImage(images(CheckState), New Point(0, 0))
    8. End Sub
    9. End Class
    Hierbei werden die Resourcen nur einmalig abgerufen, und in ein Array gepackt.
    Die Array-Indizierung kann direkt per Checkstate ablaufen, weil die Checkstates einfach die Zahlen 0,1, 2 sind.

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