![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Ситуация.
Имеется какой-либо шрифт (*.ttf, *.fon, *.otf) не установленный в системе. Он находится в папке с программой. Как использовать этот шрифт в своей программе, например в Memo или Label не устанавливая его в систему? Гугл не помог |
|
#2
|
||||
|
||||
|
Цитата:
Учись способам решения задач. ![]() |
|
#3
|
||||
|
||||
|
Подключить во время запуска в Form.OnCreate:
Код:
AddFontResource('SomeFont.ttf');
Memo1.Font.Name:= 'SomeFont';Код:
RemoveFontResource('SomeFont.ttf'); |
|
#4
|
||||
|
||||
|
т.е. сначала установить его, использовать, а потом удалить... как-то это грубо получается...
А без установки ни как...? Может как-то можно компоненте передать сторонний шрифт какой-нибудь winapi функцией? |
|
#5
|
||||
|
||||
|
Код:
AddFontResourceEx('somefont.ttf',FR_PRIVATE,0);Устанавливает, что только процесс, который вызвал функцию AddFontResourceEx, может использовать этот шрифт. Когда имя шрифта соответствует общедоступному шрифту, частный шрифт должен быть выбранным. Когда процесс завершает работу, система удалит все шрифты, установленные процессом при помощи функции AddFontResourceEx. Код:
RemoveFontResourceEx('somefont.ttf',FR_PRIVATE,0); |
|
#6
|
|||
|
|||
|
Проблемы с установкой шрифта не возникает, но проблема в том, что шрифт доступен не сразу при запуске программы, а только на второй и последующие запуски.
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) делаю после AddFontResource. AddFontResource пробовал делать и в FormOnCreate и в FormOnShow, и после SendMessage делаю Label.Font.Name - всё безрезультатно! Шрифт появляется только на второй запуск программы... |
|
#7
|
|||
|
|||
|
А если сделать это в файле проекта ДО первого вызова Application.FormCreate
|
|
#8
|
|||
|
|||
|
Я занимался сходной задачей и пришёл в решению, описаному тут http://programmersforum.ru/showthread.php?t=180046
|
|
#9
|
|||
|
|||
|
Все оказалось проще, но всё же непонятно. Ниже уже работающий код с объяснениями. Сразу ремарка: в проекте у L_Indicator шрифт выставлен как "Birch Std" с пробелом. Поэтому я его и пытался всегда использовать в run-time.
Делаю так: В FormOnCreate проверяю наличие шрифта и, если его нет, извлекаю ресурс и регистрирую в системе: Код:
if Screen.Fonts.IndexOf('Birch Std')=-1 then
begin
f_BirchStd:=ExtractFilePath(paramstr(0))+'FontBirchStd.otf';
TResourceStream.Create(hInstance, 'Font_BirchStd', RT_RCDATA).SavetoFile(f_BirchStd);
f_sys_B:=GetEnvironmentVariable('WINDIR');
f_sys_B:=f_sys_B+'\FONTS\BirchStd.otf';
CopyFile(PWideChar(f_BirchStd),PWideChar(f_sys_B),true);
DeleteFile(PWideChar(f_BirchStd));
hReg := TRegistry.Create;
hReg.RootKey := HKEY_LOCAL_MACHINE;
hReg.LazyWrite := false;
hReg.OpenKey('Software\Microsoft\Windows NT\CurrentVersion\Fonts',false);
hReg.WriteString('BirchStd (TrueType)','BirchStd.otf');
hReg.CloseKey;
hReg.free;
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
FNewFont_BirchStd:=true;
end;Для использования шрифта "сразу" в первом запуске в FormOnShow делаю так: Код:
if FNewFont_BirchStd then
begin
if AddFontResource(PWideChar(f_sys_B))=0 then
MessageDlg('Не удалось установить шрифт "BirchStd"!',mtError,[mbOK],0)
else
begin
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
L_Indicator.Font.Name:='BirchStd';
end;
end;Т.е. имя шрифта, регистрируемое в системе через реестр, с пробелом в имени, а по команде AddFontResource, его имя без пробела для этого шрифта. Для другого может быть по другому. Почему так? Почему имя шрифта изменяется? Последний раз редактировалось limbast, 25.09.2014 в 13:48. |