Як підвантажити фонт із ресурсу
Хочу показати псевдографіку шрифтом FixedSys, але не має псевдографіки, тому користувався іншим (Terminal начебто). Нещодавно знайшов підправлений FixedSysOEM.fon – відобразив, отримав, що хотів, але цей шрифтовий файл бовтається на гвинті, що мені дуже не подобається. У ресурс файл заштовхати - можу, з ресурсу дістати і покласти на гвинт - теж можу, але як підключити фонт не з гвинта? AddFontResource просить файл з гвинта (c:\123.fon), з CreateFileMapping до ладу не зміг розібратися. Щось подібне робить TotalCommander - звідки бере фонт (у ресурсах його не знайшов) і показує їм текст, причому на гвинті ніяких додаткових. файлів не з'являється. У якому напрямі рити?
> звідки бере фонт (у ресурсах його не знайшов) і показує їм текст Може, посимвольно малює?
А чого це тобі обов'язково "не з гвинта"?
AddFontResource просить файл з гвинта (Must use string, no handle, for filename), з CreateFileMapping розібрався (створю, пишу, читаю), але звернутися до файлу можна тільки по хендлу - в наявності несумісність функцій, я в безвиході, може хтось зіткне з мертвої точки?
2Чапаєв Конкретніше по "посимвольно". Файл буде запускатися і з READONLY диска і у мене немає бажання думати про рамдрайв, HDD (вони можуть бути відсутніми).
> Щось подібне робить TotalCommander - звідки бере > фонт (у ресурсах його не знайшов) та показує їм текст
AFAIK, він встановлює систему шрифт. Потім, можливо, використовує функцію AddFontResourceEx з прапором FR_PRIVATE. Чому не можна покласти файл зі шрифтом у папку з програмою та використовувати вказану мною функцію з відповідним прапором? Фонт (не сам файл звичайно) не буде видно нікому, крім твого процесу.
Увімкнення шрифту як ресурс у *.EXE
Увімкнення шрифту у ваш EXE:
Перші два параметри можуть бути будь-якими. Вони будуть використовуватися в програмі пізніше.
Потім для створення файлу *.res використовуйте компілятор командного рядка BRCC32.EXE, що поставляється з Delphi. Якщо файл на етапі 1 був названий MyFont.rc, командний рядок у сеансі DOS повинен виглядати так: -------------------------- -------------------------------------------------- ---- BRCC32 MyFont
Програма додасть до файлу створений створений ресурс .rc і створить файл з тим же ім'ям, за винятком розширення, яке буде .res: MyFont.res
Правильним буде розмістити його у секції реалізації після рядка.
Додайте процедуру створення файлу з ресурсу, який робить шрифт доступним для використання. Приклад: --------------------------------------------- ----------------------------------- procedure TForm1.FormCreate(Sender: TObject); var
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:WINDOWSFONTS. Його легшезнайти потім саме там.
Ваш знову встановлений шрифт може бути видалений програмним шляхом, звичайно, у випадку, коли він ніким не використовується:
Для отримання додаткової довідки щодо функцій AddFontResource та RemoveFontResource завітайте в електронну довідку Win32. [000091
а, прошу, вибачення, не правильно зрозумів питання, що не з гвинта треба.
Тільки ось незрозуміло,
Файл буде запускатися і з READONLY диска і у мене немає бажання думати про рамдрайв, HDD (вони можуть бути відсутніми).
чому б його на енто ріадонлі диск одразу не записати?
2Просто Джо > AFAIK, він встановлює в систему шрифт Я ж написав "..на гвинті ніяких додаткових файлів не з'являється", до речі викликів AddFontResource?? ні. > AddFontResourceEx з прапором FR_PRIVATE і AddFontResource непогано справляється, без глобального оповіщення звичайно, до речі триває воно у мене секунди 2-3.
2KilkennyCat & Просто Джо Ці варіанти я до вас "обсмоктав" і "проковтнув". У будь-якому випадку дякую, хоч хтось відгукнувся.
> чому б його на ентот ріадонлі диск відразу не записати? Людська пам'ять має межі і мені хочеться пам'ятати WinApi, Delphi, а не те що, при копіюванні моєї проги я повинен скопіювати ще якийсь там фонт. До того ж я знаю, що це мені стане в нагоді і вирішувати це завдання (або подібне) все одно доведеться.
> і мені хочеться пам'ятати WinApi, Delphi, а не те що при копіюванні > моєї проги я повинен скопіювати ще якийсь там фонт.