Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1092922960
SMT
2004-08-19 17:42
2004.09.12
Четкие изображения экрана в Help-файле


4-1091091114
Alek
2004-07-29 12:51
2004.09.12
Как получить десркиптор текущего активного окна?


14-1093037351
Soft
2004-08-21 01:29
2004.09.12
Резюме Саурона или особенности трудоустройства магов:)


4-1091095156
AlexanderSK
2004-07-29 13:59
2004.09.12
Обмен сообщениями внутри сервиса


3-1092810724
Belkova
2004-08-18 10:32
2004.09.12
Первичный ключ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский