Darstellungsproblem von eigener ComboBox / eigenen Controls

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    @RodFromGermany Sorry :D

    VB.NET-Quellcode

    1. Public Class MyComboBox : Inherits ComboBox
    2. #Region " Funktionen & Events "
    3. Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    4. MyBase.OnPaint(e)
    5. ' DrawString Parameter
    6. Dim y As Integer = CInt(e.Graphics.MeasureString(Text, Font).Height / 2)
    7. Dim x As Integer = CInt(e.Graphics.MeasureString(Text, Font).Width)
    8. Dim cmbRect As Rectangle = New Rectangle(0, 0, Width, Height)
    9. ' DropDownIcon Parameter
    10. Dim Px As Integer = Width - 6
    11. Dim Py As Integer = CInt(Height / 2 - 3)
    12. ' Points für das Dreieck
    13. Dim P1 As New Point(Px, Py)
    14. Dim P2 As New Point(Px - 12, Py)
    15. Dim P3 As New Point(Px - 6, Py + 6)
    16. Dim PolyP() As Point = {P1, P2, P3}
    17. e.Graphics.FillRectangle(Brushes.White, cmbRect)
    18. e.Graphics.DrawRectangle(New Pen(CT.BorderColor), 0, 0, Width - 1, Height - 1)
    19. e.Graphics.FillPolygon(New SolidBrush(CT.BorderColor), PolyP)
    20. If Me.Focused Then
    21. e.Graphics.FillPolygon(New SolidBrush(CT.ControlSelectColor), PolyP)
    22. End If
    23. e.Graphics.DrawString(Text, Font, New SolidBrush(ForeColor), New Point(2, CInt(Height / 2 - y)))
    24. End Sub
    25. Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs)
    26. MyBase.OnDrawItem(e)
    27. SetTheme(Themes)
    28. e.Graphics.DrawString(MyBase.Items(e.Index).ToString, Font, New SolidBrush(ForeColor), New Point(e.Bounds.X, CInt(e.Bounds.Y / 2)))
    29. End Sub
    30. Sub New()
    31. MyBase.New
    32. MyBase.FlatStyle = FlatStyle.Flat
    33. MyBase.Font = New Font("Verdana", 9, FontStyle.Regular)
    34. Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    35. Me.SetStyle(ControlStyles.UserPaint, True)
    36. Me.DropDownStyle = ComboBoxStyle.DropDownList
    37. End Sub
    38. Private Sub MyComboBox_Enter(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Enter
    39. Invalidate()
    40. End Sub
    41. Private Sub MyComboBox_Leave(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Leave
    42. Invalidate()
    43. End Sub
    44. Private Sub MyComboBox_Resize(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Resize
    45. Invalidate()
    46. End Sub
    47. #End Region
    48. End Class
    .wife {right: 100%; margin: 0;}
    @Bianco
    CT?
    SetTheme(Themes)?
    Und:
    Integer-Division geht in VB so: Height \ 2
    =====

    Bianco schrieb:

    noch nicht richtig dargestellt
    Streiche mit der Maus über die Items, da werden alle zu Bold geändert.
    Also solltest Du ein Rück-Ändern implementieren.
    =====
    Du malst an eine falsche y-Position, das letzte Item lässt sich per Maus nicht selektieren.
    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!

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

    @RodFromGermany

    CT -> Struct mit verschienden Color-Variablen um das aktuelle Design festzuhalten.
    SetThemes(Themes) -> Ist eine Funktion, die das aktuell gewählte Design ausließt und in das Struct schreibt. Themes -> Ist die Property, die das Design enthält.

    RodFromGermany schrieb:

    Streiche mit der Maus über die Items, da werden alle zu Bold geändert.
    Also solltest Du ein Rück-Ändern implementieren.


    Ich verstehe nicht ganz, wie du das meinst, da mir die Schrift von Beginn an als "Bold" dargestellt wird.
    Ohne das ich auch nur ein einziges Mal mit der Maus über die Schrift gefahren bin.

    Allerdings hatte ich dazu schon einmal einen Code-Schnipsel gefunden, die ein ähnliches Problem beheben sollte.
    Jedoch führte das bei mir zu keinem Erfolg, wobei ich nicht ganz verstanden habe, warum diese drei Zeilen hinzugefügt werden sollten.

    VB.NET-Quellcode

    1. e.DrawBackground()
    2. e.Graphics.DrawString(Me.Items(e.Index), e.Font, New SolidBrush(ForeColor), e.Bounds.X, e.Bounds.Y)
    3. e.DrawFocusRectangle()


    Diese sollten vor dem eigentlichen DrawString. Aber was ist der Effekt, den Background zu zeichen, den String und anschließend den Focus auf das Rechteck?
    Zum Ende wird dann ja noch ein weiteres Mal der String gezeichnet.
    Zudem ist es doch eigentlich das Selbe, wenn ich ein FillRectangle oder ein DrawBackground mache, oder nicht?

    Diese ComboBox bringt mich leicht zum verzweifeln :D
    .wife {right: 100%; margin: 0;}

    Bianco schrieb:

    da mir die Schrift von Beginn an als "Bold" dargestellt wird.
    Bei mir halt nicht.
    Mach doch mal ein neues Projekt mit dem Code aus meinem Link oben, musste halt nach VB.NET übersetzen.
    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!