Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как подгрузить фонт из ресурса? [D7, WinXP]


Andrata ©   (2005-05-24 01:54:00) 

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


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


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


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


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

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

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

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


KilkennyCat   (2005-05-26 02:24:00) [3]

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

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

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


KilkennyCat   (2005-05-26 02:21:00) [4]

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


KilkennyCat   (2005-05-26 02:18:00) [5]

Из Кулибы.

Включение шрифта как ресурс в *.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


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


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


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


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

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

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


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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо