2008-09-20 21 views

Antwort

10

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; 
2

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); 
1

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; 
+0

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

+0

Die SendMessage wird Probleme auf Vista haben. Anstelle von SendMessage (HWND_BROADCAST, ..) möchten Sie SendMessage (Application.Handle, ..) – smo

+0

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

Verwandte Themen