Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение имени шрифта, зная имя файла шрифта 
:(
    Опции темы
Poseidon
Дата 19.5.2005, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



function GetFontResourceInfoW (FontPath : PWideChar; var BufSize : DWORD; FontName : PWideChar; dwFlags : DWORD) : DWORD; stdcall; external 'GDI32.DLL'; 

1-ый параметр - указатель на Wide-строку, содержащую путь к файлу шрифта; 
2-ой параметр - указатель на DWORD-переменную, содержащую размер выходного буфера. После выполнения функции в этой переменной будет содержаться необходимая длина буфера; 
3-ий параметр - указатель на буфер, в случае успешного выполнения будет содержать Wide-строку имени шрифта; 
4-ый параметр - какие-то флаги, если рыться в функции GetFontResourceInfoW особым случаем является когда dwFlags=4, но зачем это, я так и не понял - в результате будет возвращен тот же путь к файлу; ну а для получения имени шрифта флаг должен быть равен 1. 
Код

function GetFontName (FontFileA : PChar) : String; 
type 
  TGetFontResourceInfoW = function (FontPath : PWideChar; var BufSize : DWORD; FontName : PWideChar; dwFlags : DWORD) : DWORD; stdcall; 
var 
  GetFontResourceInfoW : TGetFontResourceInfoW; 
  FontFileW : PWideChar; 
  FontNameW : PWideChar; 
  FontFileWSize, FontNameSize : DWORD; 

begin 
  Result := ''; 
  GetFontResourceInfoW := GetProcAddress(GetModuleHandle('gdi32.dll'), 'GetFontResourceInfoW'); 
  if @GetFontResourceInfoW = nil then Exit; 
  if AddFontResource(FontFileA) = 0 then Exit; 

  FontFileWSize := (Length(FontFileA)+1)*2; 
  GetMem(FontFileW, FontFileWSize); 
  StringToWideChar(FontFileA, FontFileW, FontFileWSize); 

  FontNameSize := 0; 
  FontNameW := nil; 
  GetFontResourceInfoW (FontFileW, FontNameSize, FontNameW, 1); 
  GetMem (FontNameW, FontNameSize); 
  FontNameW^ := #0; // на случай какого-нибудь облома 
  GetFontResourceInfoW (FontFileW, FontNameSize, FontNameW, 1); 

  Result := FontNameW; 
  FreeMem (FontFileW); 
  FreeMem (FontNameW); 

  RemoveFontResource(FontFileA); 
end; 


Пример вызова: 
GetFontName('C:\MyFonts\FUTURA.TTF') - возвратит 'FuturaEugenia'. 

PS: Всё бы хорошо, но эта функция хоть и есть в Win9x, только её там вызывать нельзя - пишет "This function is only valid in Windows NT mode."... 
FontView в Win9x использует EnumFontFamiliesEx (видимо по предложенному Vit'ом и x77 способу)... 
FontView в WinNT использует GetFontResourceInfo (в импорте вообще нет EnumFontFamiliesEx или других Enum*)... 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1013 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.