|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Как подгрузить свой шрифт
Ситуация.
Имеется какой-либо шрифт (*.ttf, *.fon, *.otf) не установленный в системе. Он находится в папке с программой. Как использовать этот шрифт в своей программе, например в Memo или Label не устанавливая его в систему? Гугл не помог Програмистами не рождаются, ими становятся! |
#2
|
||||
|
||||
Цитата:
Учись способам решения задач. Не стоит путать форумы с богадельнями. © Bargest |
#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. |