10

プログラムに一時的にいくつかのフォントをロードする必要があります。できればdllリソースファイルから。

4

3 に答える 3

10

そしてここにDelphiバージョン:

procedure LoadFontFromDll(const DllName, FontName: PWideChar);
var
  DllHandle: HMODULE;
  ResHandle: HRSRC;
  ResSize, NbFontAdded: Cardinal;
  ResAddr: HGLOBAL;
begin
  DllHandle := LoadLibrary(DllName);
  if DllHandle = 0 then
    RaiseLastOSError;
  ResHandle := FindResource(DllHandle, FontName, RT_FONT);
  if ResHandle = 0 then
    RaiseLastOSError;
  ResAddr := LoadResource(DllHandle, ResHandle);
  if ResAddr = 0 then
    RaiseLastOSError;
  ResSize := SizeOfResource(DllHandle, ResHandle);
  if ResSize = 0 then
    RaiseLastOSError;
  if 0 = AddFontMemResourceEx(Pointer(ResAddr), ResSize, nil, @NbFontAdded) then
    RaiseLastOSError;
end;

次のように使用されます:

var
  FontName: PChar;
  FontHandle: THandle;
...
  FontName := 'DEJAVUSANS';
  LoadFontFromDll('Project1.dll' , FontName);
  FontHandle := CreateFont(0, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET,
    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH,
    FontName);
  if FontHandle = 0 then
    RaiseLastOSError;
于 2008-09-21T10:14:19.557 に答える
2

これはGoogleで見つけました。以下の関連コードを切り取って貼り付けました。

リソースファイルにフォントを追加する必要があります。


34 FONT "myfont.ttf"

次のCコードは、DLLリソースからフォントをロードし、使用が終了するとメモリから解放します。

DWORDカウント;
HMODULEモジュール=LoadLibrary( "mylib.dll");
HRSRCリソース=FindResource(Module、MAKEINTRESOURCE(34)、RT_FONT);
DWORDの長さ=SizeofResource(Module、Resource);
HGLOBALアドレス=LoadResource(Module、Resource);
HANDLEハンドル=AddFontMemResourceEx(Address、Length、0、&Count);

/*ここでフォントを使用します...*/

RemoveFontMemResourceEx(Handle);
FreeLibrary(モジュール);
于 2008-09-20T09:16:07.723 に答える
1

実行可能ファイル内からフォントをロード/利用可能にするコードを次に示します (つまり、フォントは一般的に Windows にインストールする必要があるものではなく、リソースとして埋め込まれていました)。

プログラムがフォントを削除するまで、どのアプリケーションでもフォントを使用できることに注意してください。これがどれほど役立つかわかりませんが、私は数回使用しました。私はフォントをdllに入れたことはありません(私はこの「exeに埋め込む」アプローチを好みます)が、それが物事を大きく変えるとは思いません。

手順 TForm1.FormCreate(送信者: TObject);
変数
    ResStream : TResourceStream;
    sFileName : 文字列;
始める
    sFileName:=ExtractFilePath(Application.ExeName)+'SWISFONT.TTF';

    ResStream:=nil;
    試す
        ResStream:=TResourceStream.Create(hInstance, 'Swisfont', RT_RCDATA);
        試す
            ResStream.SaveToFile(sFileName);
        を除外する
            on E:EFCreateError Do ShowMessage(E.Message);
        終わり;
    最後に
        ResStream.Free;
    終わり;

    AddFontResource(PChar(sFileName));
    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
終わり;


手順 TForm1.FormDestroy(送信者: TObject);
変数
    sFile:文字列;
始める
    sFile:=ExtractFilePath(Application.ExeName)+'SWISFONT.TTF';
    FileExists(sFile) の場合
    始める
        RemoveFontResource(PChar(sFile));
        SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
        DeleteFile(sFile);
    終わり;
終わり;
于 2008-09-20T11:18:16.213 に答える