| |
VB.NET - Ein- und UmsteigerCombobox 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 | |
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 | |
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 | |
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 | |
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. | |
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... | |
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 | |
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? | |
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. | |
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? | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere Infos
|