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