Transparente Textbox in Menu ToolStrip

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    Transparente Textbox in Menu ToolStrip

    Hi Ihr,

    will mein Proggi verschönern.
    Das kann ja wählbare Hintergrundfarben auch für die Menus.
    Nun habe ich im Main-Menu eine Textbox die ich mit folgenden Codes transparent schalte:

    VB.NET-Quellcode

    1. ' In Variablen-Deklaration
    2. ' transparente Textbox
    3. Private WithEvents TransparenteToolStripTextBox As New TransparentTextBox()
    4. Public mnu_Mainform_txb_Fensterliste As New ToolStripControlHost(TransparenteToolStripTextBox)
    5. ' In Load-Handler
    6. ' transparente Textbox in Menu_Mainform
    7. TransparenteToolStripTextBox.AutoSize = True
    8. TransparenteToolStripTextBox.Size = New Size(350, 20)
    9. TransparenteToolStripTextBox.BackColor = Color.Transparent
    10. TransparenteToolStripTextBox.TextAlign = HorizontalAlignment.Right
    11. TransparenteToolStripTextBox.BorderStyle = BorderStyle.None
    12. TransparenteToolStripTextBox.Name = "mnu_Mainform_txb_Fensterliste"
    13. mnu_Mainform_txb_Fensterliste.Alignment = ToolStripItemAlignment.Right
    14. mnu_MainForm.Items.Add(mnu_Mainform_txb_Fensterliste)
    15. ' Dazu eine Klasse:
    16. Public Class TransparentTextBox
    17. Inherits System.Windows.Forms.TextBox
    18. Public Sub New()
    19. SetStyle(ControlStyles.SupportsTransparentBackColor, True)
    20. BackColor = Color.Transparent
    21. End Sub
    22. Protected Overrides Sub OnPaintBackground(e As PaintEventArgs)
    23. MyBase.OnPaintBackground(e)
    24. Dim b As New SolidBrush(Me.BackColor)
    25. e.Graphics.FillRectangle(b, Me.ClientRectangle)
    26. b.Dispose()
    27. End Sub
    28. End Class
    29. ' Beliebige Text-Zuweisung im Programm-Ablauf
    30. mnu_Mainform_txb_Fensterliste.Text = IO.Path.GetFileNameWithoutExtension(VordergrundFensterOwner) & " | " & VordergrundFensterTitel
    31. mnu_Mainform_txb_Fensterliste.BackColor = Color.Transparent


    Starte ich mein Programm, ist keine Textbox in der Menuleiste zu sehen - also wohl transparent
    Belege ich aber deren Text-Eigenschaft, wird die Textbox undurchsichtig.
    Und ich weiss nicht, warum.

    Habe hier vieles über transparente Textboxen gelesen, finde aber meinen Fehler nicht.
    Kann mir da vielleicht einer von Euch weiterhelfen?

    Schönes Rest-Weekend @all

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

    Dideldum schrieb:

    Belege ich aber deren Text-Eigenschaft, wird die Textbox undurchsichtig.
    Probier mal, Vordergrund und Hintergrund in einer gemeinsamen Prozedur zu setzen.
    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!
    Hi @RodFromGermany

    danke Dir für den Tip :)

    Das ist ja das komische...
    Wenn ich testhalber:

    VB.NET-Quellcode

    1. mnu_Mainform_txb_Fensterliste.Text = IO.Path.GetFileNameWithoutExtension(VordergrundFensterOwner) & " | " & titel
    2. mnu_Mainform_txb_Fensterliste.ForeColor = Color.Transparent
    3. mnu_Mainform_txb_Fensterliste.BackColor = Color.Transparent

    verwende, wird der Text auch brav durchsichtig - nur die BackColor schert sich nicht um die Zuweisung.

    Mir schleierhaft, warum diese BackColor Einstellung die Textbox kalt lässt.
    Ich habe auch schon andere Ansätze versucht, welche ich hier gefunden habe, um eine transparente Textbox in die Menubar zu zaubern - aber die will einfach nicht das tun, was mir vorschwebt. ;(
    Hi @Haudruferzappeltnoch,
    das war auch meine erste Idee - aber ich kann zum Toolstrip Menubar keine Labels hinzufügen.
    Zumindest finde ich keine Möglichkeit.
    Und wenn ich das Label in den Container werfe, bekomme ich das auch mit Location 500,-40 nicht in der Menuleiste angezeigt, weil das Label dann hinter der Menubar liegt und nicht darüber gehoben werden kann.

    EDIT:
    Geht doch - aber nicht im Designer...

    VB.NET-Quellcode

    1. Dim toolStripItem As New ToolStripLabel()
    2. toolStripItem.Text = "Mein Label"
    3. toolStripItem.Padding = New Padding(0, 0, 20, 0)
    4. toolStripItem.Alignment = ToolStripItemAlignment.Right
    5. mnu_MainForm.Items.Add(toolStripItem)


    Rechtsbündig und transparent :D

    Danke Dir @Haudruferzappeltnoch :)
    Ich dachte bislang, dass auch nur das zu Containern hinzugefügt werden kann, was auch im Designer zur Verfügung steht. :/
    Du hast meinen Sonntach gerettet - darfst Dir ein Leckerli aus dem Süssfach dafür rausnehmen. ^^
    EDIT:
    Jetzt sieht die Menubar genial aus :thumbsup:
    Ihr seid Super!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dideldum“ ()

    Falls jemand mal diese Funktion braucht, ein Label rechtsbündig in der Menu Toolstrip Bar, das maximal den verfügbaren Platz zwischen letztem Menu-Eintrag und rechten Rand des Menu-Toolstrip ausfüllt und den Text rechsbündig im Label am rechten Rand des ToolStrips anzeigt. Wenn der Text grösser ist, als der verfügbare Platz ist, wird dieser gekürzt und mit "..." ergänzt:

    VB.NET-Quellcode

    1. ' in Deklaration
    2. Dim mnu_Mainform_label As New ToolStripLabel()
    3. Dim LabelText As String
    4. ' Im Load-Handler
    5. ' Label in Menu ToolStrip
    6. mnu_Mainform_label.Padding = New Padding(0, 0, 5, 0)
    7. mnu_Mainform_label.Alignment = ToolStripItemAlignment.Right
    8. mnu_Mainform_label.TextAlign = System.Drawing.ContentAlignment.MiddleRight
    9. mnu_Mainform_label.AutoSize = True
    10. mnu_MainForm.Items.Add(mnu_Mainform_label)
    11. ' im Mainform-SizeChanged
    12. Private Sub StateChangedForm_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged
    13. LabelInMenuToolStripSetzenUndAnpassen()
    14. End Sub
    15. ' Text in Label schreiben und Label anpassen
    16. Private Sub TextInLabelSchreiben()
    17. LabelText = "Mein Text"
    18. LabelInMenuToolStripSetzenUndAnpassen()
    19. End Sub
    20. ' SubText-Ausgabe und Breitenanpassung des Labels
    21. Private Sub LabelInMenuToolStripSetzenUndAnpassen()
    22. If LabelText IsNot Nothing Then
    23. mnu_Mainform_label.Text = LabelText
    24. ' Maximal verfügbare Breite
    25. Dim menuWidth As Integer = mnu_MainForm.Items.OfType(Of ToolStripMenuItem)().Sum(Function(item) item.Width)
    26. Dim availableWidth As Integer = mnu_MainForm.Width - menuWidth
    27. If availableWidth < 0 Then availableWidth = 0
    28. ' Setzen der Breite des Labels
    29. ' Text kürzen, wenn er nicht passt
    30. Dim displayText As String = LabelText
    31. Do While TextRenderer.MeasureText(displayText & "...", mnu_Mainform_label.Font).Width > availableWidth - 20 AndAlso displayText.Length > 0
    32. displayText = displayText.Substring(0, displayText.Length - 1)
    33. Loop
    34. If LabelText <> displayText Then
    35. displayText &= "..."
    36. End If
    37. mnu_Mainform_label.Text = displayText
    38. End If
    39. End Sub

    Bilder
    • LabelInMenuBar.jpg

      23,94 kB, 1.290×74, 44 mal angesehen
    • LabelInMenuBar1.jpg

      12,03 kB, 535×74, 43 mal angesehen

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Dideldum“ ()