Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Заблокирован
1
RAD XE3+

Имя шрифта, подгруженного из ресурса

15.05.2020, 03:45. Показов 2447. Ответов 17

Author24 — интернет-сервис помощи студентам
Возможно ли узнать имя шрифта, подгруженного из ресурса (приватно). Функции для работы с перечислимыми шрифтами в этом случае не работают, хотя сами шрифты прекрасно отображаются.

Название: 001189.png
Просмотров: 125

Размер: 11.0 Кб

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const
  UF_RESOURCE_TYPENAME = 'RT_FONT'; // тип ресурса шрифтов (из RC-файла)
 
// загрузка приватного шрифта из ресурса. Прекрасно работает!
function LoadResourceFont(const ResourceName: string): HFont;
var
  FontsCount : integer;
begin
   var stream:= TResourceStream.Create(hInstance, ResourceName, UF_RESOURCE_TYPENAME);
   try
     result:= AddFontMemResourceEx(stream.Memory, stream.Size, nil, @FontsCount);
   finally
     stream.Free();
   end;
end;
Кто шарит?

модуль:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
unit uFonts;
 
{$R fonts\fonts.res}
 
interface
 
{$REGION 'Info'}
(* Модуль работы со шрифтами.
   Инфа взята отсюда:
     https://delphisources.ru/forum/showthread.php?t=25264
     https://********************/showthread.php?t=180046
     http://users.atw.hu/delphicikk/listaz.php?id=2128&oldal=38
     http://www.undocprint.org/winspool/getfontresourceinfo
     https://forum.lazarus.freepascal.org/index.php?topic=39124.0 *)
{$ENDREGION}
 
{$REGION 'uses'}
uses
  //============================== Модули проекта ==============================
  //==================== Модули проекта с формами и фреймами ===================
  //=============================== Левые модули ===============================
  //=================== Системные модули, добавленные вручную ==================
  Windows, Messages, Classes, SysUtils, Graphics;
{$ENDREGION}
 
// установка всех шрифтов из секции ресурсов FONT
function InitUserFontResources(const SkipInstalled: Boolean = false): int32;
function GetUserFontData(const hf: HFONT; stream: TCustomMemoryStream): boolean;
 
// глобальные переменные
var
  UserFontNames: TStringList;
 
implementation
 
const
  UF_RESOURCE_TYPENAME = 'RT_FONT'; // тип ресурса шрифтов (из RC-файла)
 
// загрузка приватного шрифта из ресурса. Прекрасно работает!
function LoadResourceFont(const ResourceName: string): HFont;
var
  FontsCount : integer;
begin
   var stream:= TResourceStream.Create(hInstance, ResourceName, UF_RESOURCE_TYPENAME);
   try
     result:= AddFontMemResourceEx(stream.Memory, stream.Size, nil, @FontsCount);
   finally
     stream.Free();
   end;
end;
 
// коллбэк для перечисления EnumResourceNames()
function EnumResNameCallback(hModule: NativeUInt; lpszType: LPCTSTR; lpszName: LPTSTR; lParam: LONG_PTR): boolean; stdcall;
var
  list: TStringList absolute lParam;
begin
  var res_name:= string(lpszName);
  assert(res_name <> '');
 
  var hf:= LoadResourceFont(res_name);
  list.AddObject(Format('%s [0x%.8X]', [res_name, hf]), pointer(hf));
  result:= true;
end;
 
// установка всех шрифтов из секции ресурсов FONT
function InitUserFontResources(const SkipInstalled: Boolean): int32;
begin
  // чтение имён ресурсов-шрифтов
  if not EnumResourceNames(0, UF_RESOURCE_TYPENAME, @EnumResNameCallback, LONG_PTR(UserFontNames))
    then exit(-1);
 
  result:= UserFontNames.Count; // возвращает кол-во добавленных шрифтов
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
end;
 
// образ файла шрифта по HFont (не работает со шрифтами, установленными из памяти)
function GetUserFontData(const hf: HFONT; stream: TCustomMemoryStream): boolean;
begin
  var dc:= CreateCompatibleDC(0);
 
  if dc = 0
    then exit(false);
 
  try
    SelectObject(dc, hf);
    var size: int32:= GetFontData(dc, 0, 0, nil, 0); // размер данных
    if size <= 0
      then exit(false);
 
    stream.Size:= size;
    result:= GetFontData(dc, 0, 0, stream.Memory, size) = size;
  finally
    DeleteDC(dc);
  end;
end;
 
initialization
  UserFontNames:= TStringList.Create();
 
finalization
  FreeAndNil(UserFontNames);
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2020, 03:45
Ответы с готовыми решениями:

Артефакты прозрачности при отображении TBitmap(подгруженного из png-ресурса) в строчках TPopupMenu.
Всем привет.:) Не очень получается использовать png для изображений в пунктах всплывающего меню....

Использование шрифта из ресурса
Можно ли добавить шрифт в ресурс, а после использовать его? Что бы вместо public static Font...

Имя ресурса с именем из цикла
Доброго времени суток. Сразу к сути - в ресурсы проекта загружены изображения (pic_0, pic_1, pic_2...

Как вытащить сетевое имя ресурса?
Здравствуйте! Если кто знает, скажите, п-та, как узнать, является какой-либо ресурс моего...

17
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
15.05.2020, 09:11 2
GetTextFace тоже не работает? Может просто давать ресурсам соответствующее имя?
0
Заблокирован
15.05.2020, 15:02  [ТС] 3
Цитата Сообщение от murderer Посмотреть сообщение
GetTextFace тоже не работает?
нет. Не работают все функции, связанные со шрифтами через дескрипторы HFont.
Цитата Сообщение от murderer Посмотреть сообщение
Может просто давать ресурсам соответствующее имя?
В именах шрифтов встречаются недопустимые для имён ресурсов символы.
0
884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
15.05.2020, 19:34 4
Хранить в ресурсах текстовый файл с соответствием res_name его UI-имени..?

Не по теме:

А чито ето за ширифт? :О

0
Заблокирован
15.05.2020, 20:53  [ТС] 5
Цитата Сообщение от GoodWeather Посмотреть сообщение
Хранить в ресурсах текстовый файл с соответствием res_name его UI-имени..?
Ну зачем же так по-дилетантски? Я хочу сделать универсальную вещ. Костыльное решение любой дурак сделает, а я хочу добавить такой функционал во все свои программы. Чтобы приюзал модуль - и всё само сделалось. Я же самая ленивая жопа в рунете!

Имя шрифта, подгруженного из ресурса
0
Заблокирован
16.05.2020, 02:31  [ТС] 6
Короче, написал я автосоздаваемый класс, который при старте приложения просматривает все ресурсы RT_FONT, вытаскивает из них подлинные имена шрифтов и приватно устанавливает их (до выхода из приложения), пропуская те шрифты, которые глобально установлены в системе.

Для тестирования я просто спионерил несколько рандомных шрифтов из интернетов и слепил из них RES-файл.

Имя шрифта, подгруженного из ресурса


Врядли кому-то будет это интересно, но я оставлю это тут, на всякий случай - демо с исходником внутри.
Вложения
Тип файла: 7z UserFonts-rc.7z (5.11 Мб, 10 просмотров)
1
Заблокирован
16.05.2020, 02:45  [ТС] 7
Тестирование на виртуалках:

Имя шрифта, подгруженного из ресурса


Имя шрифта, подгруженного из ресурса


Прогоните под вайном, а то мне лениво его устанавливать.
0
GoodWeather
16.05.2020, 16:02
  #8

Не по теме:

Почему эт дилетантский? Стандартный общепринятый подход. Вам что, никогда не прилетало от юзеров тикетов вида?:
"Почему написано `VinqueRg-Regular`?? Какой ещё Винкуй?? Шо за РэГэ?? Какой нафик Регулар?? Хотим чтоб было нормально написано!! Меняйте на `Античный`!!"

0
Заблокирован
16.05.2020, 16:11  [ТС] 9
Цитата Сообщение от GoodWeather Посмотреть сообщение
Почему эт дилетантский?
По кочану.
И по капусте.
Цитата Сообщение от GoodWeather Посмотреть сообщение
Вам что, никогда не прилетало от юзеров тикетов вида?
Никогда.
0
GoodWeather
16.05.2020, 17:37
  #10

Не по теме:

Ну шо сказать, везёт. А нам по нескольку раз в неделю прилетает такое. Приходится делать.
Была бы такая штука со шрифтами - прям точно бы прикопались. Вот и как бы вы изменяли тогда в вашем варианте?

0
Заблокирован
16.05.2020, 18:19  [ТС] 11
Цитата Сообщение от GoodWeather Посмотреть сообщение
Ну шо сказать, везёт. А нам по нескольку раз в неделю прилетает такое. Приходится делать.
Я пишу серьёзные программы управления и контроля внешним оборудованием. Оборудование военное. Мои потребители предъявляют претензии только тогда, когда программа работает неправильно. За изыски типа шрифтов, тем оформления, звуков, горячих клавиш, настроек и их сохранение/загрузку и прочие свистоперделки, делающие работу с программой комфортнее, они просто говорят "спасибо". Тут, имхо, важен правильный подход: прикручивать очередную функцию к программе я начинаю с добавления опции "включить/отключить вундервафлю".
Цитата Сообщение от GoodWeather Посмотреть сообщение
Была бы такая штука со шрифтами - прям точно бы прикопались. Вот и как бы вы изменяли тогда в вашем варианте?
Послал бы нах... К чему тут прикапываться? Я не понимаю. Мне нужны были имена шрифтов для того, чтобы подгружать только те, которые не установлены в системе. Чо не так-то? На основные функции программы возможность подгружать свои шрифты никак не влияет.
0
GoodWeather
16.05.2020, 19:45
  #12

Не по теме:

Как я уже сказал - везёт. Мне уже добавить нечего. Не знаете такого головняка как у нас. Порядком сбивает с основной разработки.

0
Заблокирован
16.05.2020, 20:01  [ТС] 13
Цитата Сообщение от GoodWeather Посмотреть сообщение
Не знаете такого головняка как у нас. Порядком сбивает с основной разработки.


У нас свои головняки есть, которые это "везение" компенсируют. Не переживай.
0
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 5
12.06.2022, 20:30 14
Привет, тема бородатая, но все же, было бы интересно глянуть на исходники - в архиве в упор не увидел
0
Заблокирован
12.06.2022, 20:37  [ТС] 15
Цитата Сообщение от Vayrus Посмотреть сообщение
было бы интересно глянуть на исходники - в архиве в упор не увидел
Все бинарники, которые я здесь выкладываю без исходников, содержат их внутри себя. Извлекаются они по Shift+F11.
--------
Если не влом, пожалуйста, после просмотра исходника, черкани пару строк - что ты обо всём этом думаешь.
0
0 / 0 / 0
Регистрация: 27.10.2014
Сообщений: 5
12.06.2022, 20:46 16
Как чувствовал спинным мозгом, что надо загнать в PE Explorer или еще куда, чтобы глянуть оверлеи и ресурсы, но было влом)
0
Заблокирован
12.06.2022, 20:58  [ТС] 17
Цитата Сообщение от Vayrus Посмотреть сообщение
Как чувствовал спинным мозгом, что надо загнать в PE Explorer или еще куда, чтобы глянуть оверлеи и ресурсы, но было влом)
Значит, ты такая же ленивая жопа, как и я.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
14.06.2022, 11:23 18
настоящая ленивая жопа как я не ищет хоткей в постах, а ищет их прямо на форме программы!
0
14.06.2022, 11:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2022, 11:23
Помогаю со студенческими работами здесь

Изменить имя ресурса во время выполнения программы
Доброго времени суток. допустим есть вот такая вещь : rsc = R.drawable.name1; Bitmap bMap=...

Ошибка. Имя ресурса не может использоваться несколько раз
при компиляции программы в VS на языке vb.net в процессе сборки появляется ошибка: Имя ресурса...

Получить имя ресурса на котором был произведен клик
Допустим есть картинка с названием 1.jpg. Я кbдаю ее в drawable и получается ее адрес R.drawable.1...

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

Как узнать имя шрифта?
Подскажите как узнать имя шрифта, зная путь к .ttf файлу?

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru