Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизКакой самый корркетный способ добавления шрифта в систему ? Найти похожие ветки
← →
массив (2004-08-23 03:20) [0]Есть такой не очень корректный способ :
----------------------
Чтобы установить шрифт в систему, необходимо скопировать файл шрифта в "Windows\Fonts" и добавить ключ в реестр:
"Software\Microsoft\Windows\CurrentVersion\Fonts"
Этот ключ указывает на файл шрифта. Далее запускаем API функцию "AddFontRecource". В заключении нужно уведомить систему широковещательным сообщением.uses Registry;
procedure TForm1.Button1Click(Sender: TObject);
var
hReg: TRegistry;
hBool : bool;
begin
CopyFile("C:\DOWNLOAD\FP000100.TTF",
"C:\WINDOWS\FONTS\FP000100.TTF", hBool);
hReg := TRegistry.Create;
hReg.RootKey := HKEY_LOCAL_MACHINE;
hReg.LazyWrite := false;
hReg.OpenKey("Software\Microsoft\Windows\CurrentVersion\Fonts",
false);
hReg.WriteString("TESTMICR (TrueType)","FP000100.TTF");
hReg.CloseKey;
hReg.free;
//Добавляем ресурс шрифта
AddFontResource("c:\windows\fonts\FP000100.TTF");
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
//Убираем блокировку ресурса
RemoveFontResource("c:\windows\fonts\FP000100.TTF");
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
end;
----------------------
Но во-первых папка Fonts может быть где угодно, и её точный адрес надо смотреть в ключах реестра.
А во-вторых, точно ли, что эти ключи реестра на всех виндос в одном и том же месте ? И может быть есть какой способ добавить шрифт без копания в реестре, через функции, или каким-нибудь более корректным способом ?
← →
Mim1 © (2004-08-23 05:14) [1]Как выход можно добавлять шрифт при помоши инсталятора.
← →
Юрий Зотов © (2004-08-23 07:23) [2]См. SHGetSpecialFolderLocation
← →
Iconka © (2004-08-23 09:38) [3]
> Есть такой не очень корректный способ
Это вполне корректный способ.
Только не нужно делать:
RemoveFontResource("c:\windows\fonts\FP000100.TTF");
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
← →
Mim1 © (2004-08-24 15:05) [4]А должен ли фрифт для нормальной работы находится в папке шрифтов, насколько мне известно это совсем необязательно.
Так что при запуске просто регистрируйте шрифт и используйте сколько угодно.
Широковещательное сообщение нужно для оповещения других программ о том что зарегестрирован новый шрифт, нужно ли вам это делать.
ИМХО Новый шрифт может незарегестрироваться при отсутствии прав администратора, так что лучше воспользоваться первым ответом и возложить обязанности ухода за шрифтами на инсталятор. Инсталятор на конечной машине будет запускать администратор, так что проблемм с правами не возникнет.
← →
массив (2004-08-25 03:14) [5]
> Юрий Зотов © (23.08.04 07:23) [2]
> См. SHGetSpecialFolderLocation
Да. С этой функцией более корректно.
> Iconka © (23.08.04 09:38) [3]
> Это вполне корректный способ.
А "ручное" добавление ключа в реестр - это корректно? Точно ли, что этот ключ во всех Виндосах находится на одном и том же месте, и нет ли стандартной функции для этой процедуры?
---------------
------------------------------
Нашёл ещё пример более корректного добавления шрифта в разных Виндос :var
MyFont : string;
begin
MyFont := "MyFont.ttf";
{$IFDEF WIN32}
AddFontResource(PChar(MyFont)); // AnsiString
{$ELSE}
var
s1 : array [0..255] of Char;
try
AddFontResource(StrPCopy(s1, MyFont));
except
end;
{$ENDIF}
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
Для чего эти PChar и StrPCopy ? Почему нельзя добавить просто стринг ? Для чего массивы создавать ?
Нужно ли после этой процедуры удалять фонт, также сложно, как и добавлять с PChar и StrPCopy ?
← →
Mim1 © (2004-08-25 08:15) [6]Секция в else не сработает так как var внутри процедуры никогда не сработает.
← →
массив (2004-08-26 04:18) [7]
> Mim1 © (25.08.04 08:15) [6]
> Секция в else не сработает так как var внутри процедуры
> никогда не сработает.
Попробовал запустить - сработало. Правда у меня Windows ME.
Директива {$IFDEF WIN32} - она действует только при компиляции проекта или когда программа запускается на Win32? А когда запускается на NT, то действует то, что после {$ELSE} ?
← →
Mim1 © (2004-08-26 07:50) [8]
> Попробовал запустить - сработало. Правда у меня Windows
> ME.
Код после else был пропущен компилятором.
> Директива {$IFDEF WIN32} - она действует только при компиляции
> проекта
да
> или когда программа запускается на Win32?
нет
> когда запускается на NT, то действует то, что после {$ELSE}
> ?
нет (по крайней мере старше NT4)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.044 c