プログラムに一時的にいくつかのフォントをロードする必要があります。できればdllリソースファイルから。
5743 次
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 に答える