Es necesario cargar algunas fuentes temporalmente en mi programa. Preferiblemente desde un archivo de recursos dll.¿Cómo puedo cargar temporalmente una fuente?
Respuesta
Y aquí una versión de 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;
para ser utilizado como:
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;
me encontré con this Google. He cortado & pegado el código relevante a continuación.
es necesario agregar la fuente a su archivo de recursos:
34 FONT "myfont.ttf"
El siguiente código C se carga la fuente de la DLL de recursos y liberarlo de la memoria cuando haya terminado de usarlo.
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);
Aquí hay algo de código que se carga/poner a disposición de la fuente desde el interior de su ejecutable (es decir, la fuente fue incorporado como un recurso, en lugar de algo que era necesario instalar a Windows en general).
Tenga en cuenta que la fuente está disponible para cualquier aplicación hasta que su programa se deshaga de ella. No sé lo útil se encuentra esta, pero yo he usado un par de veces. Nunca puse la fuente en un dll (prefiero este enfoque de 'incrustar en el exe') pero no creo que cambie demasiado las cosas.
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. WPF - ¿Cargar fuente de Stream?
- 2. ¿Cómo desactivar EGit temporalmente?
- 3. ¿Cómo puedo desactivar la selección de texto temporalmente usando JavaScript?
- 4. ¿Cómo puedo deshabilitar temporalmente la indexación delta con Thinking Sphinx?
- 5. ¿Cómo puedo desactivar temporalmente websocket en Google Chrome?
- 6. ¿Cómo puedo cargar una imagen desde una URL en PHP
- 7. ¿Cómo puedo saber si una fuente es una fuente de símbolo?
- 8. ¿Cómo bloquear el desplazamiento de una página web temporalmente?
- 9. ¿Cómo desactivo temporalmente los desencadenadores en PostgreSQL?
- 10. ¿Cómo puedo cargar manualmente una sesión Java usando un JSESSIONID?
- 11. ¿Cómo puedo cargar este archivo en una prueba NUnit?
- 12. ¿Cómo puedo cargar una función sin nombre en Lua?
- 13. ¿Cómo puedo desactivar javascript temporalmente después de que una página se haya cargado?
- 14. ¿Cómo puedo desactivar temporalmente todas las restricciones en una tabla en Firebird 2.1?
- 15. ¿Cómo se puede cargar una fuente (TTF) desde un archivo usando Core Text?
- 16. ¿Cómo cargo una gema de la fuente?
- 17. ¿Cómo puedo detectar los caracteres definidos en una fuente?
- 18. ¿Cómo puedo especificar una fuente más pequeña que textAppearanceSmall?
- 19. ¿Cómo puedo cambiar la fuente de una etiqueta mediante programación?
- 20. django señales desactivar temporalmente
- 21. ¿Cómo puedo leer/cargar imágenes en C++?
- 22. ¿Cómo puedo cargar un archivo usando Catalyst?
- 23. Desactivar restricciones temporalmente
- 24. ¿Cómo desactivo temporalmente una expansión de macros en C/C++?
- 25. ¿Cómo desactivar Rack-Mini-Profiler temporalmente?
- 26. PostgreSQL: deshabilitar temporalmente las conexiones
- 27. ¿Cómo puedo cargar el modelo como ayudante?
- 28. ¿Cómo puedo cargar código nuevo en github?
- 29. ¿Cómo puedo cargar alias automáticamente al inicio?
- 30. Usando un UIWebView, ¿puedo usar una fuente personalizada?
NB las variables sFileName/sFile se utilizan para crear un archivo de fuentes locales - en este caso, en el directorio donde está alojada la aplicación. – robsoft
SendMessage tendrá problemas en vista. En lugar de SendMessage (HWND_BROADCAST, ..) que le conviene a SendMessage (Application.Handle, ..) – smo
De hecho, si el programa se ejecuta en \ Archivos de programa, la extracción de la fuente a un archivo también va a ser problemático en Vista . Querrá cargar el recurso fuente desde la memoria como en el ejemplo de bmatthew ... pero también creo que necesita SendMessage. – smo