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 dobegin
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 dobegin
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) doif st in f.Style thenbegin
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.
Вот несколько предложений по улучшению кода:
Используйте meaningful variable names: Названия переменных описательны, но могут быть более явными. Например, f может быть переименовано в font, а st - в style.
Используйте константы вместо магических чисел: Код использует магические числа, такие как 3 в случае switch. Лучше будет определить константу для этого значения.
Рассмотрите использование более robust механизма обработки ошибок: Код сейчас выбрасывает исключение, если возникнет проблема с созданием или освобождением объекта шрифта. Возможно, вам стоит рассмотреть реализацию более конкретного типа исключения или механизма журналирования.
Используйте встроенные свойства Delphi для шрифтов: Вместо прямого доступа к индивидуальным свойствам шрифта, таким как Name, Height и Pitch, можно использовать встроенные доступы к свойствам шрифта Delphi, такие как Font.Name, Font.Height и Font.Pitch.
Упростите цикл проверки стиля: Код проверяет конкретные флаги стиля (например, fsBold, fsItalic) путем перебора диапазона значений от Low(TFontStyle) до High(TFontStyle). Вам можно упростить этот цикл с помощью одной строки кода, например: if f.Style in [fsBold, fsItalic] then AppendStr(S, GetEnumName(TypeInfo(TFontStyle), Ord(f.Style)));.
Вот обновленная версия кода, которая включает в себя эти предложения:
Обратите внимание, что я удалил строку f.Handle := 0, потому что она не必要на для установки HANDLE в ноль после освобождения объекта шрифта.
В статье описывается функция MakeFontFromHFont, которая позволяет получать свойства шрифта по его дескриптору и создавать объект TFont на основании полученной информации.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.