Как определить, какой шрифт установлен в системе, большой или маленький

 

Следующуя функция возвращает true, если маленькие шрифты установлены в системе. Так же можно заменить строку 'Result := (GetDeviceCaps(DC, logpixelsx) = 96);' на 'Result := (GetDeviceCaps(DC, logpixelsx) = 120);' чтобы определять - установлены ли в системе крупные шрифты.

 

 

Code:

function SmallFonts: Boolean;

{Значение функции TRUE если мелкий шрифт}

var

DC: HDC;

begin

DC := GetDC(0);

Result := (GetDeviceCaps(DC, LOGPIXELSX) = 96);

{ В случае крупного шрифта будет 120}

ReleaseDC(0, DC);

end;

 

Работа с КАЗАХСКИМИ ШРИФТАМИ.
Здравствуйте Уважаемые Господа Програмисты.
Моя небольшая статья будет, скорее всего, интересна програмистам из региона - КАЗАХСТАН.
Так как програмисты проживающиее и работающие в этом регионе чаще всего встречаются
с проблемой вывода нестандартных КАЗАХСКИХ ШРИФТОВ.
 

Когда мои программы работают на системах с установленными маленькими шрифтами, я получаю странный вид моей формы. К примеру, расположенные на форме компоненты Label становятся малы для размещения указанного теста, обрезая его в правой или нижней части. StringGrid не осуществляет положенного выравнивания и т.д.

 

Попробуй следующий код. Он масштабирует как размер формы, так и размер шрифтов. Вызывай его в Form.FormCreate. Надеюсь это поможет.

 

 Я также долго мучился над проблемой решения этого вопроса, и ниже я излагаю свои выводы на основании моих многочисленных экспериментов.

 Свойство, отвечающее за размер шрифта важно, но не менее важны в этом вопросе и другие характеристики.

 

 

 

Сразу рассмотрим плюсы и минусы помещения каждой буквы в отдельное изображение!

Плюсы :

1.Более быстрая отрисовка (так как ищется только номер картинки).

2.Буквы рисуются аккуратно, на одинаковом расстоянии друг от друга.

Эти установки должны показать шрифты совместимые либо с принтером либо с экраном. В примере диалог Windows ChooseFont вызывается напрямую чтобы показать список шрифтов, совместимых одновременно и с экраном и с принтером.

 

function GetFontResourceInfoW (FontPath : PWideChar; var BufSize : DWORD; FontName : PWideChar; dwFlags : DWORD) : DWORD; stdcall; external 'GDI32.DLL';

 

1-ый параметр - указатель на Wide-строку, содержащую путь к файлу шрифта;

2-ой параметр - указатель на DWORD-переменную, содержащую размер выходного буфера. После выполнения функции в этой переменной будет содержаться необходимая длина буфера;

3-ий параметр - указатель на буфер, в случае успешного выполнения будет содержать Wide-строку имени шрифта;

4-ый параметр - какие-то флаги, если рыться в функции GetFontResourceInfoW особым случаем является когда dwFlags=4, но зачем это, я так и не понял - в результате будет возвращен тот же путь к файлу; ну а для получения имени шрифта флаг должен быть равен 1.

 

 

Code:

procedure TConsole.FontChanged(Sender: TObject);

var

DC: HDC;

Save: THandle;

Metrics: TTextMetric;

Temp: string;

begin

if Font.Handle <> FOldFont.Handle then

begin

   DC := GetDC(0);

   Save := SelectObject(DC, Font.Handle);

   GetTextMetrics(DC, Metrics);

   SelectObject(DC, Save);

   ReleaseDC(0, DC);

   if not (((Metrics.tmPitchAndFamily and ff_Modern) <> 0) and

     ((Metrics.tmPitchAndFamily and $01) = 0)) then

   begin

     Temp := 'TConsole: ' + Font.Name +

       ' не является шрифтом с фиксированной шириной';

     Font.Name := FOldFont.Name; { Возвращаем предыдущие атрибуты шрифта }

     raise EInvalidFont.Create(Temp);

   end;

   SetMetrics(Metrics);

end;

FOldFont.Assign(Font);

if csDesigning in ComponentState then

   InternalClrScr;

end;