Laden...

System.Drawing.Font Fontfamilies wie im Forms-FontDialog zusammenfassen

Erstellt von Gimmick vor einem Jahr Letzter Beitrag vor einem Jahr 378 Views
G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor einem Jahr
System.Drawing.Font Fontfamilies wie im Forms-FontDialog zusammenfassen

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?

16.807 Beiträge seit 2008
vor einem Jahr

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.

G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor einem Jahr

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 😄.

16.807 Beiträge seit 2008
vor einem Jahr

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.

G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor einem Jahr

😁
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 ^^.