vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Combobox Fontauswahl mit angepasst formatierten DropDown-Einträgen 
Autor: Dideldum
Datum: 04.02.23 23:19

Hi Ihr,

bin heute über das folgende Script gestolpert:


https://www.vbarchiv.net/tipps/tipp_1445-combobox-zur-schriftauswahl-net.html

Auch hier ist es u.a. identisch beschrieben

https://stackoverflow.com/questions/27857076/combobox-drawitem-event-handling-for-font-combo-box-winforms-vb-net

Wäre ja toll, die zur Auswahl stehenden Schriftarten gleich in der DropDownliste nicht nur passend mit deren Name anzuzeigen, sondern gleich passend formatiert mit Font.name und Font.Style angezeigt zu bekommen.

Nur...

Ich finde die in den Links benannte DrawMode-Eigenschaft nicht in meinen Combobox-Eigenschaften noch den Ereignissen der Combobox.
Auch das MSDN scheint diese Eigenschaft nicht zu kennen.
Dummerweise findet sich in allen recherchierten passenden Scripts diese Drawmode-Eigenschaft.

Was kann ich machen, um dieses Script in mein Proggi einzubauen?
Sollte das aktuelle Net-Framwork diese Eigenschaft nicht mehr unterstützen, gibt es vielleicht andere Möglichkeiten, um diesen Effekt zu erzeugen.

Ein schönes Rest-Weekend @all
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Combobox Fontauswahl mit angepasst formatierten DropDown-Einträgen 
Autor: Manfred X
Datum: 05.02.23 10:38

Hallo!

Achte bei diesem Import darauf, welcher Combobox-Klase Du verwendest.

Imports System.Windows.Forms.VisualStyles.VisualStyleElement
 
Public Class frmFontCombo
 
    'Namespace genau angeben
    Dim WithEvents cmb As New Windows.Forms.ComboBox With
        {.Parent = Me, .Width = 150, .DropDownStyle = _
          ComboBoxStyle.DropDownList}
 
 
 
    Private Sub frmFontCombo_Load(sender As Object, e As EventArgs) Handles _
      MyBase.Load
        FillCombobox()
    End Sub
 
 
    Private Sub FillCombobox()
 
        ' alle verfügbaren Schriften auflisten
        With cmb.Items
            For Each oFont As FontFamily In Font.FontFamily.Families
                .Add(oFont)
            Next
        End With
 
        ' Wir möchten uns um die Ausgabe der 
        ' Listen-Einträge selbst kümmern
        cmb.DrawMode = DrawMode.OwnerDrawFixed
    End Sub
 
 
    Private Sub cmb_DrawItem(ByVal sender As Object,
         ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles cmb.DrawItem
 
        Dim sitem As String, ofont As Drawing.Font
        If e.Index < 0 Then Exit Sub
 
        With cmb
            ' ComboBox-Eintrag (Schriftname)
            sitem = .Items(e.Index).Name
 
            ' Neues Schrift-Objekt erzeugen und verfügbare Styles 
            ' berücksichtigen
            Dim oFamily As FontFamily = .Items(e.Index)
            If oFamily.IsStyleAvailable(FontStyle.Regular) Then
                ofont = New Font(sItem, .Font.Size, FontStyle.Regular)
            ElseIf oFamily.IsStyleAvailable(FontStyle.Italic) Then
                ofont = New Font(sItem, .Font.Size, FontStyle.Italic)
            ElseIf oFamily.IsStyleAvailable(FontStyle.Bold) Then
                ofont = New Font(sItem, .Font.Size, FontStyle.Bold)
            ElseIf oFamily.IsStyleAvailable(FontStyle.Underline) Then
                ofont = New Font(sItem, .Font.Size, FontStyle.Underline)
            Else
                ofont = New Font(sItem, .Font.Size, FontStyle.Strikeout)
            End If
        End With
 
        ' Brush für Textfarbe
        Using oBrush As Brush = New SolidBrush(e.ForeColor)
 
            ' Hintergrund
            e.DrawBackground()
 
            ' Text (Schriftname) ausgeben
            e.Graphics.DrawString(sitem, ofont, oBrush, e.Bounds.X, e.Bounds.Y)
        End Using
 
    End Sub
 
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Combobox Fontauswahl mit angepasst formatierten DropDown-Einträgen 
Autor: Dideldum
Datum: 05.02.23 23:08

Servus Manfred,

danke Dir für das Script.

Genau dieses hatte ich ja gefunden, was meine Begierde nach der formatierten Schriftart-Anzeige in der DropDown-Liste meiner Combos ausgelöst hat.

Ich finde zwar die passende CoBo unter "Allgemeine Steuerelemente" mit der Eigenschaft "DrawMode", aber diese kann ich weder in die Symbolleiste noch das Kontextmenu meines TextEditors verpflanzen, um sie dort zu nutzen.
In der Symbolleiste und dem Kontextmenu kann ich wohl nur die spezifische (abgespeckte) Symbolleisten- bzw. Kontextmenu-CoBos verwenden.

Damit habe ich einen Tag lang verspielt und finde dennoch keine Lösung für dieses Problem.
Gibt es hierfür keine Lösung?

Wünsche einen schönen Rest-Abend
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Combobox Fontauswahl mit angepasst formatierten DropDown-Einträgen 
Autor: Kuno60
Datum: 06.02.23 01:32

Hallo Dideldum!

Die ToolStripComboBox ist eine gehostete ComboBox für ToolStrips (Symbolleisten, Kontextmenüs). Sie besitzt eine Eigenschaft "ComboBox". Damit kann auf die interne ComboBox zugegriffen werden. Somit steht auch "DrawMode" zur Verfügung.

Dieses Beispiel benötigt eine "Form1" mit einem "ToolStrip" und auf diesem eine "ToolStripComboBox1".
Public Class Form1
 
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    With ToolStripComboBox1
      For Each f In FontFamily.Families
        .Items.Add(f)
      Next
      .ComboBox.DrawMode = DrawMode.OwnerDrawFixed
      .ComboBox.DropDownStyle = ComboBoxStyle.DropDownList
      AddHandler .ComboBox.DrawItem, AddressOf ToolStripComboBox1_DrawItem
    End With
  End Sub
 
  ' Vertikale Zentrierung
  Private Shared ReadOnly SF As New StringFormat With {.LineAlignment = _
    StringAlignment.Center}
 
  ' Items zeichnen
  Private Sub ToolStripComboBox1_DrawItem(sender As Object, e As _
    DrawItemEventArgs)
    If e.Index < 0 Then Return
    With ToolStripComboBox1
 
      Dim ff As FontFamily = DirectCast(.Items(e.Index), FontFamily)
      Dim fs As Single = .Font.Size
 
      Dim oFont As Font
      If ff.IsStyleAvailable(FontStyle.Regular) Then
        oFont = New Font(ff, fs, FontStyle.Regular)
      ElseIf ff.IsStyleAvailable(FontStyle.Italic) Then
        oFont = New Font(ff, fs, FontStyle.Italic)
      ElseIf ff.IsStyleAvailable(FontStyle.Bold) Then
        oFont = New Font(ff, fs, FontStyle.Bold)
      ElseIf ff.IsStyleAvailable(FontStyle.Underline) Then
        oFont = New Font(ff, fs, FontStyle.Underline)
      Else
        oFont = New Font(ff, fs, FontStyle.Strikeout)
      End If
 
      e.DrawBackground()
      Using oBrush As New SolidBrush(e.ForeColor)
        e.Graphics.DrawString(ff.Name, oFont, oBrush, e.Bounds, SF)
      End Using
    End With
  End Sub
 
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Combobox Fontauswahl mit angepasst formatierten DropDown-Einträgen 
Autor: Manfred X
Datum: 06.02.23 08:40

Hallo!

Die Windows.Forms-Controls stellen eine Grundfunktionalität zur Verfügung.
Wenn Du spezielle Gestaltungsabsichten umsetzen willst, solltest Du Dich
zunächst damit beschäftigen, wie man UserControls programmieren kann.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Combobox Fontauswahl mit angepasst formatierten DropDown-Einträgen 
Autor: Dideldum
Datum: 11.02.23 18:59

Hi Manfred und Kuno,

Danke Euch für die Tips!

Mit Kunos Script konnte ich tatsächlich die Combos so umbauen, dass diese in den Dropdown-Listen die formatierten Schriften angezeigt haben. Das hat prima geklappt.

Manfred,
ja, mit VB6 habe ich lustig UserControls erstellen können.
Aber mit dem VB.net ist alles so anders.
Das muss ich mir alles noch aneignen.
Aber erst, wenn ich diese auch brauche - learning by doing und so...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Combobox Fontauswahl mit angepasst formatierten DropDown-Einträgen 
Autor: Dideldum
Datum: 05.03.23 18:19

Hi Ihr,

ich versuche gerade die formatierte Schriftart-Combobox mit dem Script von Kuno in mein Projekt einzubinden.

Hier habe ich ein Problem, welches ich mir nicht erklären kann.

ich habe eine sub "LeseFontUndSizeUnterCaret", welche aus den subs "RTF_Box_KeyUp" und"RTF_Box_MouseUp" sowie im "RTF_Box_SelectionCHanged" aufgerufen wird.
In dieser Sub lasse ich die "R"egular, "B"old, "I"talic, "U"nderline, "S"trikeout Buttons je nach Schriftschnitt unter dem Caret einfärben.
Das klappt auch prima.

Aber die formatierte Schriftart-Combobox weigert sich, die Schriftart anzuzeigen, welche sich unter dem Caret befindet.
Und selektierter Text übernimmt nicht die Schriftart-Auswahl aus der Combobox.

Mit dem herkömmlichen unformatierten Inhalt der Schriftart-Combobox hat alles bestens funktioniert.

Was mache ich da denn falsch, dass das nicht mit der formatierten Combobox funktioniert?


Mein o.g. Sub sieht gekürzt so aus:

    Private Sub leseFontUndSizeUnterCaret()
        Dim tmpStyle As FontStyle
        Dim farbe As Color = Color.LightSalmon
        Dim tmpRegular As Boolean = True
 
        If LCase(IO.Path.GetExtension(dateiname)) = ".rtf" Then
 
           If tsc_TextEditor_RTFBox.SelectionFont IsNot Nothing Then
 
                ' Schriftschnitt anzeigen
 
                ' hier gekürzt... 
 
                ' Schriftart und Schriftgrösse
                Dim schriftgrösse As Integer = Int( _
                  tsc_TextEditor_RTFBox.SelectionFont.Size + 0.5)
                aktSelectedRTFFont = New Font( _
                tsc_TextEditor_RTFBox.SelectionFont.FontFamily.Name, _
                schriftgrösse, tsc_TextEditor_RTFBox.SelectionFont.Style)
                aktselectedRTFColor = tsc_TextEditor_RTFBox.SelectionColor
 
                Debug.Print("`" & aktSelectedRTFFont.FontFamily.Name & "´ - " & _
                  aktSelectedRTFFont.Style.ToString & " - " & schriftgrösse & "" & _
                  "- " & aktselectedRTFColor.ToString)
 
                sym_TextEditor_Format_cob_Schriftart.Text = _
                  aktSelectedRTFFont.FontFamily.Name
                sym_TextEditor_Format_cob_Schriftgrösse.Text = Int( _
                tsc_TextEditor_RTFBox.SelectionFont.Size + 0.5)
 
                ' Schriftfarbe
                sym_TextEditor_Format_Schriftfarbe.BackColor = _
                  tsc_TextEditor_RTFBox.SelectionColor
            End If
        End If
    End Sub
Wünsche ein schönes Rest-Weekend @all
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Combobox Fontauswahl mit angepasst formatierten DropDown-Einträgen 
Autor: Dideldum
Datum: 06.03.23 16:27

Sooootele,

das erstgenannte Problem konnte ich beseitigen.

Mit:

     sym_TextEditor_Format_cob_Schriftart.Text = _
       tsc_TextEditor_RTFBox.SelectionFont.FontFamily.ToString
klappt nun die Anzeige der selektierten Schriftart in der Combobox Schriftart.


Aber was stimmt an meinem DropDownClosed-Handler der Combobox Schriftart nicht, da mein selektierter Text so nicht die gewählte Font der Combobox übernimmt?

     If tsc_TextEditor_RTFBox.SelectionFont IsNot Nothing Then
        tsc_TextEditor_RTFBox.SelectionFont = New Font( _
          sym_TextEditor_Format_cob_Schriftart.Text, _
          tsc_TextEditor_RTFBox.SelectionFont.Size, _
          tsc_TextEditor_RTFBox.SelectionFont.Style)
     End If
Was wäre hier die korrekte Zuweisung?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Combobox Fontauswahl mit angepasst formatierten DropDown-Einträgen 
Autor: Dideldum
Datum: 07.03.23 18:27

Jetzt bin ich ein bisserl weiter...
Aber umso verwirrter.

Test-Code:
If tsc_TextEditor_RTFBox.SelectionFont IsNot Nothing Then
 
    Dim newString As String = _
      sym_TextEditor_Format_cob_Schriftart.SelectedItem.ToString
    Dim newFont As New Font(newString, CInt( _
    tsc_TextEditor_RTFBox.SelectionFont.Size + 0.5), _
    tsc_TextEditor_RTFBox.SelectionFont.Style)
 
    Debug.Print(newFont.FontFamily.ToString & " ... `" & newFont.Name & "´" & "" & _
      "/ " & newString & " - " & tsc_TextEditor_RTFBox.SelectionFont.Size & " -" & _
      "" & tsc_TextEditor_RTFBox.SelectionFont.Style)
 
    tsc_TextEditor_RTFBox.SelectionFont = newFont
End If
Ergebnis des testhalber eingebauten Debug.Prints ist z.B. wenn ich in meiner Combo_Schriftart die Schriftart "Segoe UI Semilight" auswähle:

"[FontFamily: Name=Microsoft Sans Serif] ... `Microsoft Sans Serif´ / [FontFamily: Name=Segeo UI Semilight] - 12 - 0"

Also übernimmt die Variable "newFont" nicht neue Font mit den dieser übergebenen Werte.

Selbst, wenn ich die neue Font vereinfacht so definiere:
Dim newFont As New Font( _
  sym_TextEditor_Format_cob_Schriftart.SelectedItem.ToString, 12, _
  FontStyle.Regular)
bleibt die Variable "newFont" auf der Standard-Einstellung mit "MS Sans Serif" als FontFamily.

Mit
Dim newFont As New Font("Playbill", 12, FontStyle.Regular)
funktioniert es aber.

Also liegt es am String, den ich aus dem selectedItem der Combo_Schriftart übernehme.

Was mache ich denn falsch, dass ich "newFont" nicht die Auswahl der Combo-Schriftart zuordnen kann?

EDIT:
Oh Mann - Fehler gefunden und vor Stirn patsche...
If tsc_TextEditor_RTFBox.SelectionFont IsNot Nothing Then
 
    Dim cboString As FontFamily = _
      sym_TextEditor_Format_cob_Schriftart.SelectedItem
    Dim newFont As New Font(cboString.Name, CInt( _
    tsc_TextEditor_RTFBox.SelectionFont.Size + 0.5), _
    tsc_TextEditor_RTFBox.SelectionFont.Style)
    tsc_TextEditor_RTFBox.SelectionFont = newFont
End If
So funzt es

Beitrag wurde zuletzt am 07.03.23 um 18:36:11 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Combobox Fontauswahl mit angepasst formatierten DropDown-Einträgen 
Autor: Dideldum
Datum: 09.03.23 21:46

Nu habe ich nur noch ein Problem mit meinem RTF-Editor.
Na ja, Bullets und einstellbare Seitenränder fehlen auch noch.

Aber das momentan akuteste Problem ist folgendes:

Ich muss ja immer eine komplette Font übergeben, bestehend aus Fontfamily, FontSize und Schriftschnitten, wenn ich die Selektion umformatieren will.
Eine andere Möglichkeit zum Ändern der selektierten Textbereiche habe ich nicht finden können.

Wenn ich nun aber einen Bereich markiere, der aus verschiedenen Fonts besteht und hierbei z.B. über einen Button den Schriftschnitt von Regular auf Bold ändern lassen will oder über die Combobox_Schriftgrösse die Schriftgrösse der Selektion ändern will, habe ich das Problem, dass hierbei die gesamte Selektion auf die Schriftart der Zuweisung gesetzt wird und damit die verschiedenen in der Selektion festgelegten Fonts verloren gehen.

        tsc_TextEditor_RTFBox.SelectionFont = New Font(aktFontFamily, _
          aktFontSize, aktFontStyle)
Die Eigenschaften:
tsc_TextEditor_RTFBox.SelectionFont.Size
und
tsc_TextEditor_RTFBox.SelectionFont.Style
sind ja leider ReadOnly.
Ansonsten wäre das Problem ja keines.

Wie kann ich dieses Problem umschiffen und in Selektionen mit verschriedenen Fonts nur die Styles und/oder Schriftgrösse ändern ohne die Fonts gleichzeitig ändern zu müssen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel