Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Anwendungs- und Menü-Fonts

4 views
Skip to first unread message

Michael Landenberger

unread,
Jan 24, 2022, 6:52:39 AM1/24/22
to
Hallo,

ich schreibe gerade an einem Programm, bei dem ich möchte, dass der innerhalb
des Programms verwendete Font derselbe ist wie der, den Windows für
Titelzeilen, Menüs etc. verwendet. Ich möchte auch in jedem Fall
sicherstellen, dass sich das Programm in diesem Punkt nach den
Windows-Einstellungen richtet und dabei auch Änderungen an diesen
Einstellungen durch den Benutzer berücksichtigt.

Um zu ermitteln, welche Schriftarten eingestellt sind, verwende ich die
API-Funktion SystemParametersInfo () mit SPI_GETNONCLIENTMETRICS als
Parameter. Die Funktion füllt eine Struktur vom Typ TNonClientMetrics mit den
entsprechenden Daten.

Die Struktur TNonClientMetrics enthält u. a. die Felder lfMenuFont,
lfStatusFont und lfMessageFont. Alle drei sind vom Typ TLogFont. Dieser
wiederum enthält das Feld lfFaceName mit dem Namen des entsprechenden Fonts.

Ich habe nun festgestellt, dass nach Aufruf der Funktion bei allen drei Fonts
in lfFaceName 'Segoe UI' steht. Das ist aber leider nicht der Font, den
Windows für Menüs etc. verwendet. Vielmehr ist der dort verwendete Font
zumindest auf meinem System 'Tahoma'. Stelle ich diesen Font in meinem
Programm ein, sehen Texte im Programm genauso aus wie die Menüs oder die
Fenster-Titelzeile. Verwende ich dagegen den durch SystemParametersInfo
ermittelten Font 'Segoe UI', unterscheiden sich Texte im Programm minimal von
denen in Menüs und Titelzeile.

Auffällig ist auch, dass 'Tahoma' auch der Standardwert ist, mit dem neu
erstellte Font-Objekte vorbelegt sind. Irgendwoher muss Delphi diesen Font
haben. Aber woher? Sollte dieser Font bei jeder Erstellung eines Formulars von
Windows abgefragt werden, wäre es einfach: ich müsste dann nur einmalig ein
TFont-Objekt erstellen und dessen Namen für spätere Verwendung speichern. Ist
der Font dagegen in der VCL hart codiert [1], nutzt mir das nix, denn es wird
dann immer 'Tahoma' verwendet, auch wenn der Benutzer einen anderen Font
eingestellt hat.

[1] Ich habe durch Analyse der Unit VCL.Graphics festgestellt, dass TFont beim
Erstellen mit einer Struktur namens DefFontData initialisiert wird. In dieser
Struktur ist aber 'MS Sans Serif' eingetragen. Trotzdem enthält in folgendem
Codebeispiel die Variable "FontName" nach der Ausführung den String 'Tahoma':

var

FontName : string;

...
with TFont.Create do begin
FontName := Name;
Free
end;

Wo um alles in der Welt kommt das her? Der Quelltext der Methode TFont.GetName
liefert keinen Hinweis darauf. Wäre für etwas Aufklärung dankbar.

Gruß

Michael

Michael Landenberger

unread,
Jan 24, 2022, 7:09:11 AM1/24/22
to
"Michael Landenberger" schrieb am 24.01.2022 um 12:52:36:

> Wo um alles in der Welt kommt das her?

Nachtrag: Hab's 'rausgefunden. DefFontData.Name wird zwar in der Deklaration
der Variablen auf 'MS Sans Serif' initialisiert. Allerdings wird die Variable
im initialization-Abschnitt der Unit VCL.Graphics anschließend mit neuen
Werten belegt, und zwar in der Prozedur "InitDefFontData". Um den Font-Namen
zu ermitteln, wird in dieser Prozedur der Registry-Key
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes\MS Shell Dlg
2 ausgelesen. Und da steht auf meinem Rechner 'Tahoma' drin. Ich nehme an,
dass dieser Registry-Eintrag immer den Namen des jeweils eingestellten
System-Fonts enthält und auch Änderungen durch den Benutzer widerspiegelt.
Daher ermittle ich den Namen des in meinem Programm zu verwendenden Fonts
jetzt einfach dadurch, dass ich ein TFont-Objekt erstelle, dessen Namen in
einer Variablen speichere und es das Objekt dann wieder freigebe. Das
funktioniert erstmal.

Gruß

Michael

Jens Köhler

unread,
Jan 24, 2022, 10:44:43 AM1/24/22
to
Am 24.01.2022 um 13:09 schrieb Michael Landenberger:
> "Michael Landenberger" schrieb am 24.01.2022 um 12:52:36:
>
>> Wo um alles in der Welt kommt das her?
>
> Ich nehme an,
> dass dieser Registry-Eintrag immer den Namen des jeweils eingestellten
> System-Fonts enthält und auch Änderungen durch den Benutzer widerspiegelt.
>
> Gruß Michael
>

Hallo,
das sollte sich doch testen lassen, indem Du mal eine ganz andere
Schriftart im System einstellst?

Jens

Michael Landenberger

unread,
Jan 24, 2022, 10:58:31 AM1/24/22
to
"Jens Köhler" schrieb am 24.01.2022 um 16:44:41:

> Am 24.01.2022 um 13:09 schrieb Michael Landenberger:

>> Ich nehme an,
>> dass dieser Registry-Eintrag immer den Namen des jeweils eingestellten
>> System-Fonts enthält und auch Änderungen durch den Benutzer widerspiegelt.

> das sollte sich doch testen lassen, indem Du mal eine ganz andere
> Schriftart im System einstellst?

Nach Lektüre von
<https://docs.microsoft.com/de-de/windows/win32/intl/using-ms-shell-dlg-and-ms-shell-dlg-2>
habe ich einen eigenen Test nicht mehr für notwendig gehalten ;-)

Gruß

Michael
0 new messages