Использование шрифтов с пиктограммами при разработке приложений в Lazarus IDE

от автора

При разработке прототипа приложения, достаточно удобно использовать уже имеющиеся в команде изображения пиктограмм. Обычно все используемые пиктограммы упакованы в шрифт. А если чего-то не хватает, то можно использовать сервисы генерации шрифта, например Fontello, и добавить новые пиктограммы.

Пиктограммы из шрифта на элементах формы

Пиктограммы из шрифта на элементах формы

В процессе разработки, шрифт можно установить в систему, и он будет доступен для выбора у всех элементов (компонентов) в дизайнере окон Lazarus IDE. И если задать в качестве текста элемента нужный символ, то он сразу отобразится на данном элементе в дизайнере форм. Таким образом, не собирая приложение, можно будет оценить визуальный стиль, например, оценить то как будут смотреться значки, какого они будут размера и так далее.

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

Загрузка шрифта из файла ttf

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

procedure TForm1.FormCreate(Sender: TObject); begin  AddFontResource(PChar(GetCurrentDir+'\MyFont.ttf'));  ToolBar1.Font.Name:='MyFont'; end;  procedure TForm1.FormDestroy(Sender: TObject); begin  RemoveFontResource(PChar(GetCurrentDir+'\MyFont.ttf')); end;

Загрузка шрифта из ресурса приложения

В этом случае, в начале шрифт необходимо добавить в ресурсы проекта. Для чего в настройках проекта, в пункте Ресурсы, необходимо добавить файл шрифта, а в окне выбора файла ресурса указать что необходимо отображать все файлы (*.*). Добавленному ресурсу присвоить нужное название и проверить, что указан тип RCDATA.

Добавление шрифта в ресурсы приложения

Добавление шрифта в ресурсы приложения

Для загрузки шрифта, в код нужно будет добавить специальный тип и определить дополнительные процедуры:

const   MM_MAX_NUMAXES = 16;  type    PDesignVector = ^TDesignVector;   TDesignVector = packed record     dvReserved: DWORD;     dvNumAxes: DWORD;     dvValues: array [0..MM_MAX_NUMAXES-1] of Longint;   end;  

добавить в конец раздела type, перед разделом var определение двух функций:

  function AddFontMemResourceEx (p1: Pointer; p2: DWORD; p3: PDesignVector; p4: LPDWORD): THandle; stdcall;  external 'gdi32.dll' name 'AddFontMemResourceEx';   function RemoveFontMemResourceEx (p1: THandle): BOOL;  stdcall;  external 'gdi32.dll' name 'RemoveFontMemResourceEx';

А в раздел имплементации добавить функцию загрузки шрифта по имени ресурса, которая возвращает дескриптор, с помощью которого можно идентифицировать ресурс, и далее освободить его.

function LoadFontFromRes (FontName: PChar): THandle; var   ResHandle: HRSRC;   ResSize, NbFontAdded: Cardinal;   ResAddr: HGLOBAL; begin   ResHandle := FindResource (system.HINSTANCE, FontName, Windows.RT_RCDATA);   if ResHandle = 0 then RaiseLastOSError;   ResAddr := LoadResource (system.HINSTANCE, ResHandle);   if ResAddr = 0 then RaiseLastOSError;   ResSize := SizeOfResource (system.HINSTANCE, ResHandle);   if ResSize = 0 then RaiseLastOSError;   result := AddFontMemResourceEx (Pointer (ResAddr), ResSize, nil, @NbFontAdded);   if result = 0 then RaiseLastOSError; end;

По аналогии с предыдущим вариантом в обработчики событий добавляется код для загрузки шрифта в при создании формы и выгрузке его при уничтожении формы.

procedure TForm1.FormCreate(Sender: TObject); begin  RecourceFontHandle:=LoadFontFromRes('MYFONT'); //  здесь RecourceFontHandle:THandle; - глобальная переменная  ToolBar1.Font.Name:='MyFont'; end;  procedure TForm1.FormDestroy(Sender: TObject); begin  RemoveFontMemResourceEx(RecourceFontHandle); end;

Заключение

Надеюсь что формат небольшой статьи, с описанием решений по маленькой, но конкретной теме будет более интересным и полезным чем предыдущие публикации.


ссылка на оригинал статьи https://habr.com/ru/articles/868962/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *