ユーザーの UI フォント設定を取得する呼び出しを思いつきました (Borland のハードコードされた "MS Sans Serif" の選択とは対照的に)。
ユーザーのフォント設定が次のようになっているとしましょう。
Segoe Print, 15pt
すべてのアイテム、すべてのフォーム、すべてのアプリケーションのフォントを次のように設定します。
Segoe Print, 15pt
問題は、物事が断ち切られていることです。ボタンが小さすぎる - 狭すぎる、短すぎる。ラベルの文字が切れるなど。
フォームには Scaled プロパティがありますが、フォント サイズによっては変わりません。scaled プロパティは、数値「0」の高さに基づいてシリアル化されるときにフォームをスケーリングしました。
ユーザーの Windows アプリケーション設定をサポートするためにボーランドがどのように私を意図したかについてのヘルプを見つけることができません。
ユーザーのフォント設定を処理するにはどうすればよいですか?
注:エンバーガデロのニュース サーバーが機能しなくなっているか、検閲されているか、壊れているか、ログインが必要なように見えるため、エンバーガデロのニュース グループ サーバーからこれをクロス ポストしました。
更新 1
DPI 設定ではなく、ユーザーのフォント設定について話しているのです。つまり、次の言語に依存しない疑似コードを想像してください。
procedure TForm1.FormCreate(Sender: TObject);
var
FontFace: string;
FontHeight: Integer;
begin
GetUserFontPreference(out FontFace, out FontHeight);
Self.Font.Name := FontFace;
Self.Font.Height := FontHeight;
end;
注:これは私の実際のコードではありません (結局のところ、これは言語に依存しない疑似コードです)。さらに、フォーム上のすべてのコントロールを再帰的に処理し、必要に応じてフォントを変更する必要があります。フォントに親とは異なるスタイル (太字など) が適用されていて、親から継承されなくなった場合は、手動で設定する必要があります。
lkesslerの要求に従って、ユーザーの UI フォント設定を Windows から取得するコードは次のとおりです。
procedure GetUserFontPreference(out FaceName: string; out PixelHeight: Integer);
var
lf: LOGFONT;
begin
ZeroMemory(@lf, SizeOf(lf));
//Yes IconTitleFont (not SPI_GETNONCLIENTMETRICS MessageFont)
if SystemParametersInfo(SPI_GETICONTITLELOGFONT, SizeOf(lf), @lf, 0) then
begin
FaceName := PChar(Addr(lf.lfFaceName[0]));
PixelHeight := lf.lfHeight;
end
else
begin
{
If we can't get it, then assume the same non-user preferences that
everyone else does.
}
FaceName := 'MS Shell Dlg 2';
PixelHeight := 8;
end;
end;