Moin,
ich bastel mir gerade diverse Dialoge mit Zusatzfunktionen nach, unter anderem auch den Forms FontDialog.
Dabei ist mir nun aufgefallen, dass in dem original Dialog einige FontFamilies zusammengefasst und dann über den Style ausgewählt werden, Beispiel:
Arial
Arial Black
Bei mir:
Arial - Regular, Bold, Italic
Arial Black - Regular, Bold, Italic
...
Bei Windows:
Arial - Halb Schmal, Halb Schmal Kursiv, Kursiv, Standard, Halb Schmal Fett, Halb Schmal Fett Kursiv, Fett, Fett Kursiv, Schwarz, Schwarz Schräg
Für das Abfragen der Families nehme ich:
System.Drawing.Text.InstalledFontCollection installedFonts = new System.Drawing.Text.InstalledFontCollection();
Foreach(System.Drawing.Font fontfamily in installedFonts.Families)
//In Liste einfügen ...
Und für das Abfragen der verfügbaren Stile:
foreach(System.Drawing.FontStyle style in Enum.GetValues(typeof(System.Drawing.FontStyle)))
{
if(SelectedFontFamily.IsStyleAvailable(style))
...
}
Mein Frage ist nun: Wie kann man die Fontfamilien so zusammenfassen, wie der Dialog das macht, und die zusätzlichen "Styles" erhalten?
Arial - Halb Schmal, Halb Schmal Kursiv, Kursiv, Standard, Halb Schmal Fett, Halb Schmal Fett Kursiv, Fett, Fett Kursiv, Schwarz, Schwarz Schräg
Von welchem Dialog oder welcher Anwendung sprichst Du?
Im Windows Font Manager erfolgt die Auflistung bei Windows 10 zumindest zunächst nach Font Families.
Das Untermenü listet dann die Faces auf.
WinWord listet einfach alle Fonts nach dem Fullname ohne Gruppierung auf.
Beide gehen direkt auf die Registry (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts).
Haben also wohl eine eigene Logik.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich rede vom ganz normalen Windows-Forms FontDialog in .NET Framework 4.8/.NET6 Win 10.
In der Tat ist die Darstellung in unterschiedlichen MS-Programmen ebenfalls unterschiedlich. In den Optionen von Windows wird dann von "Metadaten" gesprochen ... so eine richtige Einheitlichkeit scheint es nicht zu geben.
Wäre natürlich schön diese eigene Logik zu kennen 😁 Weniger wegen der Gruppierung, sondern mehr, weil .IsStyleAvailable(style) true zurück gibt, obwohl sich bei Auswahl des Styles gar nichts ändert. Da werden die Styles dann wohl unterstützt, aber nicht verwendet.
Ich vermute ein wenig, dass System.Drawing.Font nicht wie System.Windows.Font zwischen Font-Weight und Font-Style unterscheidet und eben alles über die paar enum-typen für den Style abfackelt.
Habe mir mal das WPF Beispiel von MS angesehen, mit Windows.Media.Font scheinen sich diese Probleme in Luft auf zu lösen.
Tendiere nun doch eher dazu es für Drawing.Font einfach zu halten und den Dialog für Media.Font bei Zeiten nochmal zu ergänzen 😄.
Ich rede vom ganz normalen Windows-Forms FontDialog in .NET Framework 4.8/.NET6 Win 10.
Also von https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.fontdialog?view=windowsdesktop-6.0?
Das hat ja nichts mit Windows zutun, sondern ist einfach eine proprietäre Implementierung in .NET.
Aber der Quellcode ist doch Open Source, dann schau doch einfach nach 😉
Ich vermute ein wenig, dass System.Drawing.Font nicht wie System.Windows.Font zwischen Font-Weight und Font-Style unterscheidet und eben alles über die paar enum-typen für den Style abfackelt.
Technisch gesehen sind alles getrennte Fonts, die einfach anhand des Familiennamens zusammen gefasst werden.
Es gibt auf der Font-Ebene (Datei etc) kein Merkmal für Family und Style.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
😁
Habe mal nachgeschaut... ist mir zuviel Win32 zum "mal eben nachvollziehen". Werde mich an dem WPF-Beispiel orientieren und den Drawing.Font-Dialog so lassen ^^.