Я придумал вызов, который получает предпочтение пользовательского интерфейса пользователя (как против Borland жестко кодированного выбора "MS Sans Serif" ).
Предположим, что предпочтительнее пользовательский шрифт:
Segoe Print, 15pt
Я устанавливаю шрифт всех элементов во всех формах во всех приложениях:
Segoe Print, 15pt
Проблема в том, что вещи теперь отрезаны. Кнопки слишком маленькие - слишком узкие, слишком короткий. Текст в ярлыках отключен и т.д.
Форма имеет свойство Scaled, но это не изменяется в зависимости от шрифта размеры. Масштабированное свойство масштабировало форму, когда она сериализована в соответствии с высота цифры "0".
Я не могу найти что-либо в помощи для того, как Borland намеревался меня поддерживать пользовательских настроек Windows.
Как мне обрабатывать предпочтения шрифтов пользователя?
Примечание.. Я перекрестился с сервером новостей группы Embargadero, поскольку сервер новостей Embargadero, кажется, умирает, подвергается цензуре или сломается или требует входа в систему.
Обновление 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 здесь используется код для извлечения предпочтений пользовательского пользовательского интерфейса из 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;