При разработке прототипа приложения, достаточно удобно использовать уже имеющиеся в команде изображения пиктограмм. Обычно все используемые пиктограммы упакованы в шрифт. А если чего-то не хватает, то можно использовать сервисы генерации шрифта, например 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/
Добавить комментарий