Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Какой самый корркетный способ добавления шрифта в систему ?   Найти похожие ветки 

 
массив   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
4-1091094354
Егор_С
2004-07-29 13:45
2004.09.12
Появление формы поверх всех приложений


4-1087747824
parovoZZ
2004-06-20 20:10
2004.09.12
Перетащитиь форму не за заголовок


4-1091181117
Morphin
2004-07-30 13:51
2004.09.12
Ограничение размера стека потока


10-1016468603
Dmitry Borisovets
2002-03-18 19:23
2004.09.12
бесплатные реализации CORBA


4-1090940633
sensor
2004-07-27 19:03
2004.09.12
Дескриптор (handle) элемента другого приложения