Ich muss einige Schriftarten vorübergehend in meinem Programm laden. Vorzugsweise aus einer DLL-Ressourcendatei.Wie kann ich eine Schriftart vorübergehend laden?
Antwort
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;
zu dergleichen verwendet werden:
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;
Ich fand this mit Google. Ich habe & geschnitten eingefügt den entsprechenden Code unten.
Sie müssen die Schriftart auf Ihre Ressource-Datei hinzuzufügen:
34 FONT "myfont.ttf"
Der Code folgende C 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 (dh wurde die Schriftart als Ressource eingebettet, anstatt etwas, das Sie in Windows-Regel zu installieren hatten) lädt/zur Verfügung stellen.
Beachten Sie, dass die Schriftart für alle Anwendung verfügbar ist, bis Ihr Programm es los wird. Ich weiß nicht, wie nützlich Sie das finden, aber ich habe es ein paar Mal verwendet. Ich habe die Schrift nie in eine DLL geschrieben (ich bevorzuge diese "in den exe-Ansatz einbetten"), aber stelle dir nicht vor, dass sie die Dinge zu sehr verändert.
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;
NB die sFileName/sFile Variablen einer lokalen Schriftart-Datei erstellen verwendet werden - in diesem Fall, in dem Verzeichnis, in dem die Anwendung gehostet wird. – robsoft
Die SendMessage wird Probleme auf Vista haben. Anstelle von SendMessage (HWND_BROADCAST, ..) möchten Sie SendMessage (Application.Handle, ..) – smo
In der Tat, wenn das Programm in \ Programme läuft, wird das Extrahieren der Schriftart in eine Datei auch in Vista problematisch sein . Sie wollen die Font-Ressource aus dem Speicher laden, wie im Beispiel von bmatthew..aber ich denke auch, dass Sie SendMessage brauchen. – smo