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

Вниз

Как подгрузить фонт из ресурса?   Найти похожие ветки 

 
Andrata   (2005-05-24 01:54) [0]

Хочу показать псевдографику шрифтом FixedSys, но у него нет псевдографики, поэтому пользовался другим (Terminal вроде). Недавно нашел подправленный FixedSysOEM.fon - отобразил, получил, что хотел, но этот шрифтовый файл болтается на винте, что мне очень не нравится.
 В ресурс файл затолкать - могу, из ресурса достать и положить на винт - тоже могу, но вот как подключить фонт не с винта?
 AddFontResource просит файл с винта (c:\123.fon), с CreateFileMapping толком не смог разобратся. Нечто подобное делает TotalCommander - откуда то берет фонт (в ресурсах его не нашел) и показывает им текст, причем на винте никаких доп. файлов не появляется.
 В каком направлении рыть?


 
Чапаев ©   (2005-05-24 09:55) [1]

> откуда то берет фонт (в ресурсах его не нашел) и показывает им текст
Может, посимвольно рисует?

А чего это тебе обязательно "не с винта"?


 
Andrata   (2005-05-25 21:31) [2]

AddFontResource просит файл с винта (Must use string, not handle, for filename), с CreateFileMapping разобрался (создаю, пишу, читаю), но обратится к файлу можно только по хендлу - налицо несовместимость функций, я в тупике, может кто то столкнет с мертвой точки?

2Чапаев
Конкретнее по "посимвольно".
Файл будет запускатся и с READONLY диска и у меня нет желания думать о рамдрайве, HDD (они могут отсутствовать).


 
Просто Джо ©   (2005-05-26 02:14) [3]


>  Нечто подобное делает TotalCommander - откуда то берет
> фонт (в ресурсах его не нашел) и показывает им текст


AFAIK, он устанавливает в систему шрифт. А затем, возможно, использует функцию AddFontResourceEx с флагом FR_PRIVATE.
Почему нельзя положить файл со шрифтом в папку с программой и использовать указанную мной функцию с соответствующим флагом? Фонт (не сам файл, конечно) не будет виден никому, кроме твоего процесса.


 
KilkennyCat ©   (2005-05-26 02:18) [4]

Из Кулибы.

Включение шрифта как ресурс в *.EXE

Включение шрифта в ваш EXE:

Используйте ваш любимый текстовый редактор, создайте *.rc файл, описывающий шрифт:
--------------------------------------------------------------------------------
   MY_FONT ANYOL1 "Bauhs93.ttf"  

Первые два параметра могут быть любыми. Они будут использоваться в программе позже.

Затем для создания *.res файла используйте компилятор командной строки BRCC32.EXE, поставляемый с Delphi. Если ваш файл на этапе 1 был назван MyFont.rc, командная строка в сеансе DOS должна выглядеть так:
--------------------------------------------------------------------------------
   BRCC32 MyFont  

Программа добавит в компилируемый файл созданный ресурс .rc и создаст файл с тем же именем, за исключением расширения, которое будет .res: MyFont.res

В вашей программе добавьте директиву компилятора, чтобы включить вновь созданный файл:
--------------------------------------------------------------------------------
   {$R MyFont.res}  

Правильным будет разместить его в секции реализации после строчки {$R *.DFM}.

Добавьте процедуру создания файла из ресурса, делающим шрифт доступным для использования. Пример:
--------------------------------------------------------------------------------
   procedure TForm1.FormCreate(Sender: TObject);
var

Res : TResourceStream;
begin

Res := TResourceStream.Create(hInstance, "MY_FONT", Pchar("ANYOL1"));
Res.SavetoFile("Bauhs93.ttf");
Res.Free;
AddFontResource(PChar("Bauhs93.ttf"));
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;  

Теперь вы можете использовать данный шрифт в своем приложении:
--------------------------------------------------------------------------------
   procedure TForm1.Button1Click(Sender: TObject);
begin

Button1.Font.Name := "Bauhaus 93";
end;  

Предостережения:
Приведенный пример не предусматривает никакой проверки и защиты от возможных ошибок.

Обратите внимание - имя файла НЕ такое же, как имя шрифта. Это допускает, что вы знаете имя шрифта и имя его ttf-файла. Вы можете определить это, дважды щелкнув на файле в окне Проводника.

Я рекомендую устанавливать файл шрифта в папку C:\WINDOWS\FONTS. Его легче отыскать потом именно там.

Ваш вновь установленный шрифт может быть удален программным путем, естественно, в случае, когда он никем не используется:

--------------------------------------------------------------------------------
   procedure TForm1.FormDestroy(Sender: TObject);
begin

RemoveFontResource(PChar("Bauhs93.ttf"))
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;  

Для получения дополнительной справки по функциям AddFontResource и RemoveFontResource загляните в электронную справку по Win32. [000091


 
KilkennyCat ©   (2005-05-26 02:21) [5]

а, прошу, прощения, не правильно понял вопрос, что не с винта надо...


 
KilkennyCat ©   (2005-05-26 02:24) [6]

Только вот непонятно,

Файл будет запускатся и с READONLY диска и у меня нет желания думать о рамдрайве, HDD (они могут отсутствовать).

почему бы его на ентот риадонли диск сразу не записать?


 
Andrata   (2005-05-26 16:48) [7]

2Просто Джо
> AFAIK, он устанавливает в систему шрифт
Я же написал "..на винте никаких доп. файлов не появляется", кстати вызовов AddFontResource?? нет.
> AddFontResourceEx с флагом FR_PRIVATE
и AddFontResource не плохо справляется, без глобального оповещения конечно, кстати длится оно у меня секунды 2-3.

2KilkennyCat & Просто Джо
Эти варианты я до вас "обсосал" и "проглотил". В любом случае спасибо, хоть кто то откликнулся.

> почему бы его на ентот риадонли диск сразу не записать?
Человеческая память имеет пределы и мне хочется помнить WinApi, Delphi, а не то что, при копировании моей проги я должен скопировать еще какой то там фонт. К тому же я знаю, что это мне пригодится в дальнейшем и решать эту задачу (или подобную) все равно придется.


 
Просто Джо ©   (2005-05-26 16:58) [8]


> и мне хочется помнить WinApi, Delphi, а не то что, при копировании
> моей проги я должен скопировать еще какой то там фонт.


На то есть инсталляторы.



Страницы: 1 вся ветка

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
14-1117005548
stone
2005-05-25 11:19
2005.06.14
Стих


9-1111131446
Xeno
2005-03-18 10:37
2005.06.14
Как узнать количество полигонов в кадре


14-1116491813
Skier
2005-05-19 12:36
2005.06.14
Опять новая концепция развития нашего автопрома...


8-1109190242
Shamansky
2005-02-23 23:24
2005.06.14
Масштабирование видеокартинки


6-1111439002
Zion
2005-03-22 00:03
2005.06.14
Как узнать IP-адрес компа в локалке по его сетевому имени?