Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Шрифт из ресурсов...


Автор: WIN32API 23.12.2005, 15:34
Как загрузить шрифт из ресурсов программы не сохраняя его на диск? Я знаю точно, что такой способ есть! Сенкс!

Автор: _hunter 23.12.2005, 16:13
а зачем его сохранять? LoadResource() и все...

Автор: WIN32API 23.12.2005, 16:23
Не можеть быть, чтобы так просто? Я как-то видел довольно большой код, который позволяет использовать шрифт из ресурсов? Попробую.

Автор: WIN32API 23.12.2005, 17:38
2_hunter

Ерунда! Кинь мне рабочий пример, если у тебя получилось так загрузить шрифт?

Автор: _hunter 23.12.2005, 18:22
ты определись. "загрузить" или что-то другое. например "использовать"

Автор: WIN32API 23.12.2005, 18:36
а для чего его тогда грузить? вместо телевизора?

Автор: _hunter 23.12.2005, 18:56
откуда я знаю зачем тебе это понадобилось?..

Автор: WIN32API 28.12.2005, 16:44
Ребят, неужели никто не знает??

Автор: Snowy 28.12.2005, 17:18
Я никогда не пробовал, но думаю, что с помощью
Код

HANDLE AddFontMemResourceEx(
  PVOID pbFont,       // font resource
  DWORD cbFont,       // number of bytes in font resource 
  PVOID pdv,          // Reserved. Must be 0.
  DWORD *pcFonts      // number of fonts installed
);

Добавлено @ 17:18
WIN32API, а почему бы тебе не зарегестрироваться?
Уже далеко не в первый раз забегаешь...

Автор: _hunter 28.12.2005, 17:34
'неужели никто не знает" что?
напиши толком что тебе нужно

Автор: Snowy 28.12.2005, 17:39
Ему нужно в программе использовать свой шрифт.
Шрифт находится в ресурсах.
Он хочет его использовать, не сохраняя его на диск.

Автор: WIN32API 28.12.2005, 17:41
Я использую свой шрифт в программе. Инсталлировать его в систему юзера не желаю, ложить в каталог рядом с программой также.

Автор: Snowy 28.12.2005, 18:06
Если я правильно понимаю, то AddFontMemResourceEx грузит фонт из памяти.
Причем фонт нигде не фиксируется, доступен только нашей программе.
По завершении программы фонт более не существует в системе.

Автор: WIN32API 28.12.2005, 22:07
AddFontMemResourceEx прописана ли в модулях DELPHI 7. Если да - то в каком?

Автор: Snowy 28.12.2005, 22:34
Да. Модуль Windows:
Код

{$EXTERNALSYM AddFontMemResourceEx}
function AddFontMemResourceEx(p1: Pointer; p2: DWORD; p3: PDesignVector; p4: LPDWORD): THandle; stdcall;

Автор: WIN32API 29.12.2005, 10:38
Нашел функцию, но не выходит ее побороть. Ресурс находится (FindResource), с этим проблем нет, но использовать я его не могу - AddFontMemResourceEx не работает, хотя все тестится под WinXP Pro.

Код

var
  FontHandle:THandle;
  Res:HGLOBAL;
  Src:HRSRC;
  ResSize:DWORD;
  FontCount:DWORD;
  pd: PDesignVector;
begin
  Src := FindResource(hInstance, '3', 'BINRES');
   If Src <> 0 then begin
     Res := LoadResource(hInstance, Src);
     ResSize := SizeofResource(hInstance, Src);
     FontCount := 1;
     AddFontMemResourceEx(@Res, ResSize, @pd, @FontCount);
end;



Автор: _hunter 29.12.2005, 11:32
так а что за ошибка? и что за тип шрифта?
+
Цитата
PVOID pdv,          // Reserved. Must be 0.

Автор: WIN32API 29.12.2005, 11:35
А нет никаких ошибок. Тип шрифта - TTF.

Автор: _hunter 29.12.2005, 11:57
в смысле "нет никаких ошибок"?
что AddFontMemResourceEx() возвращает?
и почему, кстати, ты возвращаемое значение не береш?

Автор: WIN32API 29.12.2005, 12:17
Точно, я не посмотрел, что возвращает AddFontMemResourceEx, а под рукой сейчас Делфятины нет. Ну, добро, теоретически: если функция возвращает не нуль (все успешно) и если возвращает нуль (не успешно) и при этом не работает - куда мне копать в этих ситуациях?

Автор: _hunter 29.12.2005, 12:23
если вернет 0 -- нужно смотреть GetLastError() -- возможно что-то прояснит
а вторая ситуация просто не реальная smile

Автор: bems 6.1.2006, 18:02
Попробуй так:
Код

var
  FontHandle:THandle;
  Res:HGLOBAL;
  Src:HRSRC;
  ResSize:DWORD;
  FontCount:DWORD;
  pd: PDesignVector;
  ResAddr:pointer;
begin
  Src := FindResource(hInstance, '3', 'BINRES');
   If Src <> 0 then begin
     Res := LoadResource(hInstance, Src);
     ResSize := SizeofResource(hInstance, Src);
     ResAddr := LockResource(Res);
     FontCount := 1;
     AddFontMemResourceEx(ResAddr, ResSize, @pd, @FontCount);
end;

Автор: Gwire 1.8.2012, 13:23
Тема старая. 
Но хотелось дополнить её для ясности всей операции подключения шрифтов.

К примеру нужно встроить шрифт Concolas (файлы consola.ttf, consolab.ttf, consolai.ttf, consolaz.ttf)

1) Создать файл ресурса для дальнейшего подключения к проекту.
    а. Создать файл concolas.rc
Код

 consola     RCDATA    "consola.ttf"
 consolab    RCDATA    "consolab.ttf"
 consolai    RCDATA    "consolai.ttf"
 consolaz    RCDATA    "consolaz.ttf"

    б. Создать файл concolas.cmd (чтобы руками каждый раз не вбивать и как памятка будет)
Код

brcc32.exe concolas.rc -fo.\concolas.res
pause

    в. Запусть concolas.cmd. Будет создан нужный нам "concolas.res"

2) Скопировать полученный файл "concolas.res" к проекту

3) Далее реализовать функции загрузки и освобождения шрифта
Код

uses Classes, Windows, . . .

function LoadResourceFont(Instance: THandle; FontName: String; ResType: PChar = RT_RCDATA): THandle;
var Res: TResourceStream;
    Count: Integer;
begin
    Res:= TResourceStream.Create(Instance, FontName, ResType);
    try
       Result:= AddFontMemResourceEx( Res.Memory, Res.Size, nil, @Count );
    finally
       Res.Free;
    end;
end;

procedure FreeResourceFont(Font: THandle);
begin
    RemoveFontMemResourceEx( Font );
end;


4) В файле проекта
Код

uses
  Windows, Classes, . . .

{$R *.res}
{$R concolas.res}

// Здесь описание выше функции

var HCF: array[0..3]of THandle;
begin
    HCF[0]:= LoadResourceFont(HInstance, 'CONSOLA');
    HCF[1]:= LoadResourceFont(HInstance, 'CONSOLAB');
    HCF[2]:= LoadResourceFont(HInstance, 'CONSOLAI');
    HCF[3]:= LoadResourceFont(HInstance, 'CONSOLAZ');
  Application.Initialize;
  . . .
  Application.Run;
    FreeResourceFont( HCF[0] );
    FreeResourceFont( HCF[1] );
    FreeResourceFont( HCF[2] );
    FreeResourceFont( HCF[3] );
end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)