![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#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. |