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;
- 1. Wie kann ich beim Laden der Seite eine Web-Schriftart laden, z.
- 2. Wie kann ich eine statische Seite vorübergehend ausschalten?
- 3. Kann ich eine benutzerdefinierte Schriftart in eine Android-Anwendung einbetten?
- 4. Kann nicht Schriftart in JRE laden 8
- 5. Web-Schriftart dynamisch laden
- 6. Wie kann ich Trigger in PostgreSQL vorübergehend deaktivieren?
- 7. Laden Schriftart aus Ressourcendatei
- 8. Wie kann ich eine verschachtelte Sammlung laden?
- 9. Wie kann ich eine Schriftart um 45 Grad drehen?
- 10. Wie kann ich feststellen, ob eine .woff-Schriftart Hinweise enthält?
- 11. Wie installiere ich eine Schriftart in Server
- 12. Wie kann ich Javascript nach dem Laden einer Seite vorübergehend deaktivieren?
- 13. Kann ich WPF-Datenbindungsänderungen irgendwie vorübergehend deaktivieren?
- 14. Kann ich mit einer UIWebView eine benutzerdefinierte Schriftart verwenden?
- 15. Schriftart hat sich geändert - ich habe eine alte Lizenz - kann ich diese Schriftart noch verwenden?
- 16. Wie kann ich vorübergehend verhindern, dass ein scrollbares div scrollt?
- 17. Wie kann ich die Textauswahl vorübergehend mit JavaScript deaktivieren?
- 18. Wie kann ich STDOUT in einem Perl-Programm vorübergehend unterdrücken?
- 19. Wie deaktiviere ich ein SharePoint-Webpart vorübergehend?
- 20. vorübergehend
- 21. Wie kann ich Stderr vorübergehend in Ruby umleiten?
- 22. Wie lege ich eine Schriftart in meine iPhone-Anwendung ein?
- 23. Wie erkenne ich, ob eine Schriftart eine Symbolschrift ist?
- 24. Kann ich ein Bild durch eine benutzerdefinierte Schriftart ersetzen?
- 25. Wie Browsersync vorübergehend deaktivieren?
- 26. Warum kann meine Schriftart nicht gezeichnet werden? (Oder laden?) - Java
- 27. "RuntimeException: native Schriftart kann nicht erstellt werden" beim Laden von Schriftart
- 28. Wie erstelle ich eine benutzerdefinierte Schriftart für eine BlackBerry-Anwendung
- 29. Warum erhalte ich den Konsolenfehler 'Die Schriftart nicht laden'?
- 30. Wie kann ich in WPF auf eine Schriftart in einer Ressourcenbibliothek im Code verweisen?
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