Получение имени файла и номера шрифта по HFONT
От: Leshyk  
Дата: 24.01.10 16:22
Оценка:
Всем доброго времени суток!

Существует спецификация PANOSE. Винда имеет свою реализацию этой штуки со своими косяками. Задача следующая: воспользоваться виндовым механизмом подбора физического шрифта по логическому описанию и затем открыть подобранный шрифт сторонними средствами (например freetype). Т.е. найти местоположение этого файла на диске и если в этом файле несколько шрифтов, то и номер шрифта в файле.

Заранее спасибо.
Re: Получение имени файла и номера шрифта по HFONT
От: CEMb  
Дата: 25.01.10 03:03
Оценка:
Здравствуйте, Leshyk, Вы писали:

L>Всем доброго времени суток!


L>Существует спецификация PANOSE. Винда имеет свою реализацию этой штуки со своими косяками. Задача следующая: воспользоваться виндовым механизмом подбора физического шрифта по логическому описанию и затем открыть подобранный шрифт сторонними средствами (например freetype). Т.е. найти местоположение этого файла на диске и если в этом файле несколько шрифтов, то и номер шрифта в файле.


L>Заранее спасибо.


Может, гоню, но винды не идут в файл за фонтами при обращении, они уже все загружены, поэтому большой подозр, что соответсвующие имена файлов не держатся, потому что незачем.
Re[2]: Получение имени файла и номера шрифта по HFONT
От: Leshyk  
Дата: 25.01.10 09:16
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Может, гоню, но винды не идут в файл за фонтами при обращении, они уже все загружены, поэтому большой подозр, что соответсвующие имена файлов не держатся, потому что незачем.


Значит ли это что HFONT одного и того же шрифта всегда одинаков?
Re[3]: Получение имени файла и номера шрифта по HFONT
От: ASMelancholy Россия  
Дата: 25.01.10 12:46
Оценка:
Здравствуйте, Leshyk, Вы писали:

L>Здравствуйте, CEMb, Вы писали:


CEM>>Может, гоню, но винды не идут в файл за фонтами при обращении, они уже все загружены, поэтому большой подозр, что соответсвующие имена файлов не держатся, потому что незачем.


L>Значит ли это что HFONT одного и того же шрифта всегда одинаков?


Нет. Всегда разный.
Простой пример:
  hFnt1 = CreateFontW(12, 0, 0, 0, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, L"Tahoma");
  hFnt2 = CreateFontW(12, 0, 0, 0, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, L"Tahoma");

По HFONT нельзя узнать имя файла шрифта.
Re[4]: Получение имени файла и номера шрифта по HFONT
От: Leshyk  
Дата: 25.01.10 13:26
Оценка:
Здравствуйте, ASMelancholy, Вы писали:

ASM>По HFONT нельзя узнать имя файла шрифта.


Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?
Re[5]: Получение имени файла и номера шрифта по HFONT
От: ASMelancholy Россия  
Дата: 25.01.10 13:57
Оценка:
Здравствуйте, Leshyk, Вы писали:

L>Здравствуйте, ASMelancholy, Вы писали:


ASM>>По HFONT нельзя узнать имя файла шрифта.


L>Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?


Можно попробовать следующее:
1. Берем инфу нужного шрифта — GetObject(hFont, sizeof(LOGFONT), (LPSTR)&LogFont);
2. Перебираем все файлы шрифта и сравниваем LogFont.lfFaceName с именем шрифта из файла (не именем файла)
Re[6]: Получение имени файла и номера шрифта по HFONT
От: alsemm Россия  
Дата: 26.01.10 06:54
Оценка:
Здравствуйте, ASMelancholy, Вы писали:

ASM>Здравствуйте, Leshyk, Вы писали:


L>>Здравствуйте, ASMelancholy, Вы писали:


ASM>>>По HFONT нельзя узнать имя файла шрифта.


L>>Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?


ASM>Можно попробовать следующее:

ASM>1. Берем инфу нужного шрифта — GetObject(hFont, sizeof(LOGFONT), (LPSTR)&LogFont);
ASM>2. Перебираем все файлы шрифта и сравниваем LogFont.lfFaceName с именем шрифта из файла (не именем файла)
Вместо п2 ищем имя файла по имени шрифта в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.
Но это, похоже, работает только для TrueType шрифтов.

Нашел тут: http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.nativeapi/2003-10/0524.html
Re[5]: Получение имени файла и номера шрифта по HFONT
От: c-smile Канада http://terrainformatica.com
Дата: 26.01.10 07:45
Оценка:
Здравствуйте, Leshyk, Вы писали:

L>Здравствуйте, ASMelancholy, Вы писали:


ASM>>По HFONT нельзя узнать имя файла шрифта.


L>Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?


Выбранный шрифт в DC не гарантирует что именно им будут рисоваться все символы.
Я наблюдал вско разные варианты. В Uniscribe например алгоритм подбора шрифтов явно отличный от того что использует TextOut со товарищи.
Re[6]: Получение имени файла и номера шрифта по HFONT
От: alsemm Россия  
Дата: 26.01.10 07:56
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Выбранный шрифт в DC не гарантирует что именно им будут рисоваться все символы.

Это смотря чем рисовать. DrawText или TextOut могут подменять шрифт. А если текст рисовать через low-level Uniscribe API (функции с префиксом Script, а не ScriptString) то никакой подмены шрифтов не происходит. Приходится это руками делать, когда требуется. Тот еще закат солнца вручную
Re[6]: Получение имени файла и номера шрифта по HFONT
От: Leshyk  
Дата: 28.01.10 10:55
Оценка:
Здравствуйте, ASMelancholy, Вы писали:

ASM>Здравствуйте, Leshyk, Вы писали:


L>>Здравствуйте, ASMelancholy, Вы писали:


ASM>>>По HFONT нельзя узнать имя файла шрифта.


L>>Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?


ASM>Можно попробовать следующее:

ASM>1. Берем инфу нужного шрифта — GetObject(hFont, sizeof(LOGFONT), (LPSTR)&LogFont);
ASM>2. Перебираем все файлы шрифта и сравниваем LogFont.lfFaceName с именем шрифта из файла (не именем файла)

Есть один момент. Из хелпа:
"If hgdiobj is a handle to a font, the LOGFONT that is returned is the LOGFONT used to create the font."
Т.е. я получу не имя подобранного шрифта, а имя шрифта, который пытались создать.
Есть второй момент а если несколько шрифтов имеют одно имя?
Re[7]: Получение имени файла и номера шрифта по HFONT
От: alsemm Россия  
Дата: 28.01.10 20:31
Оценка:
Здравствуйте, Leshyk, Вы писали:

L>Здравствуйте, ASMelancholy, Вы писали:


ASM>>Здравствуйте, Leshyk, Вы писали:


L>>>Здравствуйте, ASMelancholy, Вы писали:


ASM>>>>По HFONT нельзя узнать имя файла шрифта.


L>>>Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?


ASM>>Можно попробовать следующее:

ASM>>1. Берем инфу нужного шрифта — GetObject(hFont, sizeof(LOGFONT), (LPSTR)&LogFont);
ASM>>2. Перебираем все файлы шрифта и сравниваем LogFont.lfFaceName с именем шрифта из файла (не именем файла)

L>Есть один момент. Из хелпа:

L>"If hgdiobj is a handle to a font, the LOGFONT that is returned is the LOGFONT used to create the font."
L>Т.е. я получу не имя подобранного шрифта, а имя шрифта, который пытались создать.
Используй GetTextFace, получишь имя подобранного шрифта.

L>Есть второй момент а если несколько шрифтов имеют одно имя?

map<имя-шрифта,файл-шрифта> лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.
Re[8]: Получение имени файла и номера шрифта по HFONT
От: Leshyk  
Дата: 29.01.10 11:24
Оценка:
Здравствуйте, alsemm, Вы писали:

A>Используй GetTextFace, получишь имя подобранного шрифта.

Спасибо, не знал об этой функции!

A>map<имя-шрифта,файл-шрифта> лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.

Здесь может лежать "мульти мап", никто не мешает мне установить шрифт с другим именем файла но тем же названием, и в реестре вроде будут две записи с одним именем?
Re[9]: Получение имени файла и номера шрифта по HFONT
От: alsemm Россия  
Дата: 29.01.10 17:19
Оценка:
Здравствуйте, Leshyk, Вы писали:

L>Здравствуйте, alsemm, Вы писали:


A>>Используй GetTextFace, получишь имя подобранного шрифта.

L>Спасибо, не знал об этой функции!

A>>map<имя-шрифта,файл-шрифта> лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.

L>Здесь может лежать "мульти мап", никто не мешает мне установить шрифт с другим именем файла но тем же названием, и в реестре вроде будут две записи с одним именем?
Какая разница "мульти мап" в реестер или нет? Главное что он есть и не надо его руками строить. Ну начнешь ты его руками создавать, тот же мультимап и получится. Что делать будешь?
Не думаю что информация в реестре лежит "для красоты", скорее всего ей пользуется системный font mapper. Как он там конфликты (если он возможны, в принципе) разрешает — я не знаю. Поэкспериментируй.
Re: Получение имени файла и номера шрифта по HFONT
От: Leshyk  
Дата: 15.02.10 12:22
Оценка:
Решена. Для моих целей подходит взятие GetFontData для всего файла (тэг таблицы 0), и затем использование полученной информации как простого файла шрифта.
Выяснилась одна особенность, когда GetFontData получает шрифт из коллекции ttc, она просто обрезает первые несколько байтов, что приводит к ошибочности всех смещений внутри файла, ибо они отсчитываются от начала файла. Т.е. что бы это исправить нужно прочитать кол-во таблиц и в каждой из таблиц уменьшить смещение на разность размеров файлов (размер файла ttc можно получить передав в качестве тэга таблицы "ttcf" или 0x66637474). Документация по этим таблицам лежит тут http://www.microsoft.com/typography/otspec/otff.htm#otttables
Re[3]: Получение имени файла и номера шрифта по HFONT
От: Аноним  
Дата: 09.02.11 10:27
Оценка:
Здравствуйте, Leshyk, Вы писали:

L>Здравствуйте, CEMb, Вы писали:


CEM>>Может, гоню, но винды не идут в файл за фонтами при обращении, они уже все загружены, поэтому большой подозр, что соответсвующие имена файлов не держатся, потому что незачем.


L>Значит ли это что HFONT одного и того же шрифта всегда одинаков?


Простите, что апаю тему, искал нужную мне инфу по юнискрайбу и не смог сдержаться...
Канешно разные — ибо любой хендл созданый в приложение — это отображение системного объекта, посему даже если все время обращаться к одному и тому же объекту хэндлы будут разные.
Re[4]: Получение имени файла и номера шрифта по HFONT
От: Аноним  
Дата: 09.02.11 10:38
Оценка:
Здравствуйте, ASMelancholy, Вы писали:

ASM>Нет. Всегда разный.

ASM>Простой пример:
ASM>
ASM>  hFnt1 = CreateFontW(12, 0, 0, 0, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, L"Tahoma");
ASM>  hFnt2 = CreateFontW(12, 0, 0, 0, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, L"Tahoma");
ASM>

ASM>По HFONT нельзя узнать имя файла шрифта.

Путем нехитрых манипуляций и изучения кода МФЦ оказываеться что можно
LOGFONT LogFont;
::GetObject(hFnt1, sizeof(LOGFONT), &LogFont);
LogFont.lfFaceName
Re[5]: Получение имени файла и номера шрифта по HFONT
От: Pavel Dvorkin Россия  
Дата: 09.02.11 11:02
Оценка:
Здравствуйте, Аноним, Вы писали:

ASM>>По HFONT нельзя узнать имя файла шрифта.


А>Путем нехитрых манипуляций и изучения кода МФЦ оказываеться что можно

А>LOGFONT LogFont;
А>::GetObject(hFnt1, sizeof(LOGFONT), &LogFont);
А>LogFont.lfFaceName

Во-первых, для этого вовсе не нужны исходники MFC, а во-вторых, это имя шрифта , а не файла шрифта.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.