Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получить свойство шрифта по его дескриптору

Delphi , Графика и Игры , Шрифты

Получить свойство шрифта по его дескриптору

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

uses
   TypInfo;

 function MakeFontFromHFont(aHandle: HFONT): TFONT;
 var
   LogFont: TLogFont;
 begin
   Result := TFont.Create;
   FillChar(LogFont, SizeOf(LogFont), 0);
   GetObject(aHandle, SizeOf(logfont), @LogFont);
   with LogFont, Result do
   begin
     Name   := StrPas(lffaceName);
     Height := -lfHeight;
     if lfWeight FW_MEDIUM then
       Style := Style + [fsBold];
     if lfItalic 0 then
       Style := Style + [fsItalic];
     if lfUnderline 0 then
       Style := Style + [fsUnderline];
     if lfStrikeout 0 then
       Style := Style + [fsStrikeout];
     case (lfPitchAndFamily and 3) of
       VARIABLE_PITCH: Pitch := fpVariable;
       FIXED_PITCH: Pitch    := fpFixed;
     end;
   end;
 end;


 procedure TForm1.Button1Click(Sender: TObject);
 var
   f: TFont;
   s: string;
   st: TFontStyle;
 begin
   f := MakeFontfromHFont(getStockObject(ANSI_FIXED_FONT));
   try
     memo1.Clear;
     with memo1.Lines do
     begin
       Add(Format('Name: %s', [f.Name]));
       Add(Format('Size: %d', [f.Size]));
       Add(Format('Height: %d', [f.Height]));
       Add(Format('Pitch: %s', [GetEnumName(TypeInfo(TFontPitch),
         Ord(f.Pitch))]));
       S := 'Style: [ ';
       for st := Low(St) to High(st) do
         if st in f.Style then
         begin
           AppendStr(S, GetEnumName(TypeInfo(TFontStyle), Ord(st)));
           AppendStr(S, ' ');
         end;
       AppendStr(S, ']');
       Add(S);
     end;
   finally
     f.Handle := 0;
     f.Free;
   end;
 end;

Here is a translation of the provided text into Russian:

Код-набор на Delphi демонстрирует создание объекта шрифта из HANDLE HFONT и получение его свойств.

Функция MakeFontFromHFont принимает HANDLE HFONT в качестве входного параметра, создает новый объект TFONT (TFont.Create()) и заполняет его свойствами шрифта, описываемого этим HANDLE. Функция использует API-функцию GetObject для получения свойств шрифта и заполнения структуры LogFont.

В обработчике события Button1Click, HANDLE HFONT получается из фиксированного шрифта (getStockObject(ANSI_FIXED_FONT)), передается в функцию MakeFontFromHFont и хранится в переменной f. Код затем получает различные свойства шрифта, такие как имя, размер, высота, шаг и стиль, и отображает их в компоненте Memo.

Вот несколько предложений по улучшению кода:

  1. Используйте meaningful variable names: Названия переменных описательны, но могут быть более явными. Например, f может быть переименовано в font, а st - в style.
  2. Используйте константы вместо магических чисел: Код использует магические числа, такие как 3 в случае switch. Лучше будет определить константу для этого значения.
  3. Рассмотрите использование более robust механизма обработки ошибок: Код сейчас выбрасывает исключение, если возникнет проблема с созданием или освобождением объекта шрифта. Возможно, вам стоит рассмотреть реализацию более конкретного типа исключения или механизма журналирования.
  4. Используйте встроенные свойства Delphi для шрифтов: Вместо прямого доступа к индивидуальным свойствам шрифта, таким как Name, Height и Pitch, можно использовать встроенные доступы к свойствам шрифта Delphi, такие как Font.Name, Font.Height и Font.Pitch.
  5. Упростите цикл проверки стиля: Код проверяет конкретные флаги стиля (например, fsBold, fsItalic) путем перебора диапазона значений от Low(TFontStyle) до High(TFontStyle). Вам можно упростить этот цикл с помощью одной строки кода, например: if f.Style in [fsBold, fsItalic] then AppendStr(S, GetEnumName(TypeInfo(TFontStyle), Ord(f.Style)));.

Вот обновленная версия кода, которая включает в себя эти предложения:

uses
  TypInfo;

function MakeFontFromHFont(aHandle: HFONT): TFONT;
var
  LogFont: TLogFont;
begin
  Result := TFont.Create;
  FillChar(LogFont, SizeOf(LogFont), 0);
  GetObject(aHandle, SizeOf(logfont), @LogFont);
  with LogFont, Result do
  begin
    Name := StrPas(lffaceName);
    Height := -lfHeight;
    if lfWeight = FW_MEDIUM then
      Style := Style + [fsBold];
    if lfItalic then
      Style := Style + [fsItalic];
    ...
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  font: TFont;
  s: string;
begin
  font := MakeFontFromHFont(getStockObject(ANSI_FIXED_FONT));
  try
    memo1.Clear;
    with memo1.Lines do
    begin
      Add(Format('Name: %s', [font.Name]));
      Add(Format('Size: %d', [font.Size]));
      Add(Format('Height: %d', [font.Height]));
      Add(Format('Pitch: %s', [GetEnumName(TypeInfo(TFontPitch), Ord(font.Pitch))]));
      s := 'Style: [' + Join(GetEnumNames(TypeInfo(TFontStyle)), ', ') + ']';
      Add(s);
    end;
  finally
    font.Free;
  end;
end;

Обратите внимание, что я удалил строку f.Handle := 0, потому что она не必要на для установки HANDLE в ноль после освобождения объекта шрифта.

В статье описывается функция MakeFontFromHFont, которая позволяет получать свойства шрифта по его дескриптору и создавать объект TFont на основании полученной информации.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шрифты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 08:49:32/0.0061900615692139/0