Vertikale Labels

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Vertikale Labels

    Hi,
    ich programmiere derzeit hauptsächlich in PHP, Python, Domino und Pascal (also eher Web, Groupware bzw. alte Hardware-Infrastrukturen). Mit VisualBasic habe ich bisher wenig Berührung gehabt.
    Aktuell bin ich aber an einem Projekt, das unter Windows realisiert werden soll.
    Dabei habe ich eine Matrix zur Selektion von Risiken designed und soweit funktional mit Datenbankanbindung etc. programmiert.
    Nur, was mir jetzt irgendwie fehlt - oder vielleicht sehe ich das in der IDE noch nicht, da die für mich noch etwas ungewohnt ist - sind vertikale Labels.
    Ich will die Y-Achse beschriften, aber nicht horizontal, weil das zuviel Platz wegnehmen würde und blöd aussieht.
    Aber ich finde keine Eigenschaft bei den Labels, mit der man die Textausrichtung ändern kann. Oder bin ich nur blind?
    So eine Grundfunktion des Designs müsste doch zu finden sein. Oder gibt es das erst in den kommerziellen Versionen von Visual Studio?

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Hi

    Eine entsprechende Eigenschaft gibt es nicht bei Labels. Was Du aber machen kannst ist einen Text auf das Label zu zeichnen (Graphics.DrawString). Vorher entsprechend per Graphics.TranslateTransform und Graphics.RotateTransform das Graphics um 90° drehen und nach dem zeichnen des Textes Graphics.ResetTransform.
    Mfg -Franky-
    Ich glaube eine andere Möglichkeit als über Graphics zu gehen, gibt es gar nicht.

    Hier zwei Hinweise. Den Code habe ich aber nicht angeschaut.
    codeproject.com/Articles/8383/…d-Controls-in-C-Part-I-La
    codeproject.com/Articles/19774…al-Label-Control-in-C-NET

    Freundliche Grüsse

    exc-jdbi
    Hallo,
    erstmal vielen Dank. Ich werde mich da mal einfuxxen. Eigentlich schade, dass es das nicht über die Eigenschaften hergibt. Kommt doch durchaus öfter vor, dass man das mal braucht.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Du kannst mal dieses ausprobieren:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.ComponentModel
    3. ''' <summary>
    4. ''' Dieses Controls Beschriftung läßt sich durch Veränderung seiner
    5. ''' CaptionStringFormat-Property manipulieren
    6. ''' </summary>
    7. <DebuggerDisplay("{txt}")> _
    8. <DesignerCategory("Code")> _
    9. Public Class SFLabel : Inherits Control
    10. Private ReadOnly _CaptionStringFormat As StringFormat = New StringFormat
    11. Private _ForeBrush As New SolidBrush(Color.Black)
    12. Private _BackBrush As New SolidBrush(Color.White)
    13. Public Sub New()
    14. Me.SetStyle(ControlStyles.ResizeRedraw, True)
    15. MyBase.BackColor = Color.Gainsboro
    16. End Sub
    17. Public Overrides Property ForeColor As Drawing.Color
    18. Get
    19. Return _ForeBrush.Color
    20. End Get
    21. Set(value As Color)
    22. _ForeBrush.Color = value
    23. End Set
    24. End Property
    25. Private Function txt() As String
    26. Return Text
    27. End Function
    28. Protected Overloads Overrides Sub Dispose(disposing As Boolean)
    29. If Not MyBase.IsDisposed Then
    30. For Each D As IDisposable In New IDisposable() {_ForeBrush, _BackBrush, _CaptionStringFormat}
    31. D.Dispose()
    32. Next
    33. End If
    34. MyBase.Dispose(disposing)
    35. End Sub
    36. 'Einstellung: Im Designer den Knoten der Property "CaptionStringFormat" erweitern, und Einstellungen vornehmen
    37. 'Es kann das vertikale und horizontale Alignment bestimmt werden, ob der Text umgebrochen wird (FormatFlags), welche Zeichen gekürzt werden, wenn der Text zu lang ist (Trimming)
    38. 'Die Änderungen sind sofort sichtbar - kein Kompilieren erforderlich
    39. <TypeConverter(GetType(ExpandableObjectConverter))> _
    40. <Browsable(True)> _
    41. <Category("Darstellung")> _
    42. <Description("Einige interessante Einstellmöglichkeiten der Schrift-Darstellung")> _
    43. <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    44. Public ReadOnly Property CaptionStringFormat() As StringFormat
    45. Get
    46. If Me.DesignMode Then Invalidate()
    47. Return _CaptionStringFormat
    48. End Get
    49. End Property
    50. Protected Overrides Sub OnTextChanged(e As System.EventArgs)
    51. MyBase.OnTextChanged(e)
    52. Invalidate()
    53. End Sub
    54. Private _BorderStyle As Border3DStyle = Border3DStyle.Adjust
    55. <DefaultValue(GetType(Border3DStyle), "Adjust")> _
    56. <Category("Darstellung")> _
    57. Public Property BorderStyle() As Border3DStyle
    58. Get
    59. Return _BorderStyle
    60. End Get
    61. Set(NewValue As Border3DStyle)
    62. If Object.Equals(NewValue, Me.BorderStyle) Then Return
    63. _BorderStyle = NewValue
    64. End Set
    65. End Property
    66. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    67. _ForeBrush.Color.Assign(MyBase.ForeColor)
    68. _BackBrush.Color.Assign(MyBase.BackColor)
    69. e.Graphics.FillRectangle(_BackBrush, ClientRectangle)
    70. e.Graphics.DrawString(MyBase.Text, MyBase.Font, _ForeBrush, ClientRectangle, _CaptionStringFormat)
    71. ControlPaint.DrawBorder3D(e.Graphics, ClientRectangle, _BorderStyle)
    72. MyBase.OnPaint(e)
    73. End Sub
    74. End Class
    Nach Kompilieren hast du ein SFLabel inne Toolbox. "SFLabel" bedeutet "StringFormat"-Label.
    In den Properties gibts eine Property CaptionStringFormat, die kannst du erweitern, und da allerlei einstellen - unter anderem auch
    StringFormatFlags.DirectionVertical
    Hallo ErfinderDesRades,

    jetzt muss ich mal blöd fragen. Muss ich das in jedes Projekt einbinden, oder kann ich das allgemein einmalig einbinden.
    Und wie binde ich das ein? Läuft das dann unter "Benutzersteuerelement"? In meiner Auswahl habe ich noch "Benutzerdefiniertes Steuerelement". Verstehe da nur nicht den Unterschied.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Das ist eine Klasse.
    Fügst deinem Projekt eine Klasse hinzu, benennst sie bitte SFLabel, und kopierst den Code rein.
    Dann ist das Ding im Projekt verfügbar - inne Toolbox.

    Wenn du das in mehreren Projekten verwenden willst, dann solltest du anfangen, mit "Infrastruktur-Projekten" zu arbeiten.
    Das sind Projekte, die ausserhalb der speziellen Solution stehen, aber von dieser eingebunden sind.
    Also dass mehrere Solutions dasselbe Infrastruktur-Projekt einbinden.
    Eine durchdachte Anlage des Dateisystems, in dem du entwickelst, ist für sowas erforderlich.
    Und man muss genau nachdenken, welcher Infrastruktur-Code in welches Infrastruktur-Projekt kommt.
    Ich hab zB für WinForms-Projekte zwei Infrastruktur-Projekte:
    GeneralHelpers: das hat Schwerpunkt auf listige Algorithmen, und Extension-Methoden für vergleichsweise primitive Klassen (List(Of T), FileInfo,...)
    WinformHelpers: Schwerpunkt auf Controls, Dataset, Databinding (Extensions für BindingSource, DataRows, ...)
    Ich häng einfach mal eine Solution an - da ist auch gleich das ganze Dateisystem mit reingezippt.
    Meine weiteren Solutions sind strukturgleich zum _Tests-Ordner, und liegen neben diesem - und binden ebenfalls die beiden Helpers ein.

    Darüberhinaus habich auch vor langem ein Tutorial zum Thema verzapft: Video: HelperProjekt einbinden
    Dateien
    • _Tests01.zip

      (282,39 kB, 70 mal heruntergeladen, zuletzt: )