Wie kann ich vorübergehend eine Schriftart geladen werden?
Frage
Ich brauche einige Schriftarten vorübergehend in meinem Programm zu laden. Vorzugsweise aus einer DLL-Ressource-Datei.
Lösung
Und hier eine Delphi-Version:
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;
verwendet werden soll, wie:
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;
Andere Tipps
Ich fand diese mit Google . Ich habe geschnitten und den entsprechenden Code unten eingefügt.
Sie müssen die Schriftart auf Ihre Ressource-Datei hinzuzufügen:
34 FONT "myfont.ttf"
Der folgende C-Code wird die Schriftart aus der DLL-Ressource laden und aus dem Speicher freigeben, wenn Sie fertig sind es zu benutzen.
DWORD Count; HMODULE Module = LoadLibrary("mylib.dll"); HRSRC Resource = FindResource(Module,MAKEINTRESOURCE(34),RT_FONT); DWORD Length = SizeofResource(Module,Resource); HGLOBAL Address = LoadResource(Module,Resource); HANDLE Handle = AddFontMemResourceEx(Address,Length,0,&Count); /* Use the font here... */ RemoveFontMemResourceEx(Handle); FreeLibrary(Module);
Hier einiger Code ist, der die Schriftart aus Ihrer ausführbaren Datei wird geladen / zur Verfügung stellen (dh wurde die Schriftart als Ressource eingebettet, anstatt etwas, das Sie in Windows-Regel zu installieren hatten).
Beachten Sie, dass die Schriftart verfügbar ist jeder Anwendung, bis Ihr Programm wird es los. Ich weiß nicht, wie nützlich Sie diese finden, aber ich habe es ein paar Mal verwendet. Ich habe nie setzte die Schrift in eine DLL (ich ziehe diese ‚einzubetten in die exe‘ -Ansatz), aber nicht vorstellen, dass es Dinge verändert zu viel.
procedure TForm1.FormCreate(Sender: TObject); var ResStream : TResourceStream; sFileName : string; begin sFileName:=ExtractFilePath(Application.ExeName)+'SWISFONT.TTF'; ResStream:=nil; try ResStream:=TResourceStream.Create(hInstance, 'Swisfont', RT_RCDATA); try ResStream.SaveToFile(sFileName); except on E:EFCreateError Do ShowMessage(E.Message); end; finally ResStream.Free; end; AddFontResource(PChar(sFileName)); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); end; procedure TForm1.FormDestroy(Sender: TObject); var sFile:string; begin sFile:=ExtractFilePath(Application.ExeName)+'SWISFONT.TTF'; if FileExists(sFile) then begin RemoveFontResource(PChar(sFile)); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); DeleteFile(sFile); end; end;