Использование шрифтов с пиктограммами при разработке приложений в 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;

Заключение

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

© Habrahabr.ru