Was sind eigentlich die beiden Fonts SYSTEM_FONT und DEFAULT_GUI_FONT, die durch GetStockObject zurückgegeben werden?
Sind sie ein schneller Weg um an den „MS Shell Dlg“ bzw. „MS Shell Dlg 2“?
Es ist ein Irrtum wenn man glaubt man bekommt den Standard UI Font mit DEFAULT_GUI_FONT oder SYSTEM_FONT. Dieser Irrtum basiert auf der Annahme es gebe nur einen Font den die Windows UI verwendet!
Der richtige Weg vorab: Der einzige korrekte Weg einen richtigen Font für die Default UI zu erhalten ist SystemParametersInfo mit SPI_GETNONCLIENTMETRICS. Bzw., in Dialogen sollte immer als Font „MS Shell Dlg“ bzw. „MS Shell Dlg 2“ verwendet werden (siehe auch The old new thing). Man beachte den Plural ❗
Und was sind diese beiden Fonts nun?
Es sind Relikte aus alten Tagen, die kein Mensch und vor allem kein Windows Entwickler bei Microsoft mehr verwendet. (Anmerkung des Autors: Ich habe zumindest aus zuverlässiger Quelle gehört, die Entwickler bei Microsoft wären immer noch Menschen 😉 )
- In alten Tagen von Windows 2.0 wurden SYSTEM_FONT für die Dialoge verwendet. Dieser Font hieß auch System. Man glaubt es kaum, dieser Font ist immer noch der Standard-Dialog-Font, den aber wirklich keiner mehr will. Es ist ein Bitmap Font und er kann nicht mit Anti-Aliasing verwendet werden.
- Die Geschichte von DEFAULT_GUI_FONT ist weniger spektakulär. Er wurde mit Windows 95 eingeführt und man dachte damit einen Standard gesetzt zu haben. Aber das wurde noch im selben Release zugunsten von SystemParametersInfo fallen gelassen. Es ist geblieben als weiteres Relikt aus alten Tagen.
Alle Fonts die GetStockObject liefert sind Bitmap Fonts, die auch kein ClearType unterstützen.
Siehe auch:
What are SYSTEM_FONT and DEFAULT_GUI_FONT?
What about logical fonts?
DEFAULT_GUI_FONT really stinks
Mal noch als Erweiterung, falls 0x0600 Apps auch unter XP noch den richtigen Font wählen sollen.
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);
#if(WINVER >= 0x0600)
if ((BYTE)GetVersion() < 6)
ncm.cbSize -= sizeof(int);
#endif
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
Ist mir beim derzeitigen Umstieg auf VS2008 aufgefallen, da ich nicht bei allen Apps die WINVER gesetzt hatte und dort dann 0x0600 eingesetzt wird. Ursache für die Abänderung ist eine Änderung der NONCLIENTMETRICS Struktur im SDK.
Das halte ich für den falschen Weg ❗
Wenn Du frühere Bestriebssystem unterstützen willst dann solltest Du WINVER auf den richtigen Wert setzen.
Deshalb solltest Du grundsätzlich immer WINVER setzen.
Meiner Auffassung nach ist das herumdoktern am Code, was mit einer korrekten Projekteinstellung vermieden werden kann!
Der Link für „The old new thing“ ist kaputt.