Zitat von
Luckie:
Das muss aber nicht die Systemschrift sein. Der Benutzer kann diese ja nach belieben ändern in dem Dialog: Eigenschaften von Anzeige -> Darstellung -> Erweitert. Also so ganz ist das nicht die Lösung. Und warum hast du lfMenuFont genommen und nicht lfCaptionFont zum Beispiel?
Die standard Systemschrift ermittelt man mit
Delphi-Quellcode:
var
FLogFont: TLogFont;
begin
GetObject(GetStockObject(DEFAULT_GUI_FONT), sizeof(FLogFont), @FLogFont);
Das liefert "MS Shell Dlg" zurück, was dann bei XP "Tahoma" entspricht.
Genau das ist das Problem Luckie. "MS Shell Dlg" gibt unter Vista eben nicht mehr die richtige Systemschriftart zurück. Damit wird unter Vista auch Tahoma zurückgegeben und nicht "Segoe UI" was korrekt wäre.
lfMenuFont habe ich genommen weil ich mir gedacht habe das der Menüfont für Buttons usw. sinniger ist als der Captionfont der ja (meistens) etwas größer eingestellt ist als der Menüfont. Sonst hatte das keinen besonderen Grund. Mir wäre eine Lösung wie die deine auch lieber, aber wie gesagt deine Funktion gibt halt leider die falsche Systemschriftart zurück.
[EDIT]
Mal ein kleiner Beispielcode:
Delphi-Quellcode:
procedure GetSystemFont(aFont: TFont);
var
ncMetrics: TNonClientMetrics;
begin
Assert(Assigned(aFont));
ncMetrics.cbSize := SizeOf(TNonClientMetrics);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
SizeOf(TNonClientMetrics),
@ncMetrics, 0);
aFont.Handle := CreateFontIndirect(ncMetrics.lfMenuFont);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
FLogFont: TLogFont;
begin
GetObject(GetStockObject(DEFAULT_GUI_FONT), sizeof(FLogFont), @FLogFont);
label1.Font.Name := FLogFont.lfFaceName;
label1.Font.Size := FLogFont.lfHeight;
label1.Caption := 'Dies ist die Schriftart "' + FLogFont.lfFaceName + '" unter Vista.';
GetSystemFont(label2.Font);
label2.Caption := 'Dies ist die Schriftart "' + label2.Font.Name + '" unter Vista.';
end;
Und im Anhang dazu der passende Screenshot für Leute die kein Vista haben. Der Unterschied müsste deutlich zu sehen sein.