Page 1 sur 1
Insertion de Fonts externes et includeBinary..
Publié : mar. 31/mai/2011 17:07
par Ar-S
Je viens de remarquer un truc étrange.
Si j'inclus ma Font dans l'exe, que je l'extrais et que je lance mon programme, la font n'apparait pas sur mon gadget.
Code : Tout sélectionner
Global FontBIG
DataSection
fontuser:
IncludeBinary "datas/BigDots.ttf"
fontuser_end:
EndDataSection
If FileSize("BigDots.ttf") = -1
If CreateFile(0, "BigDots.ttf")
WriteData(0, ?fontuser, ?fontuser_end - ?fontuser)
CloseFile(0)
EndIf
EndIf
;-////// CHARGEMENT DES FONTS /////////////////
coco=AddFontResource_(GetCurrentDirectory()+"BigDots.ttf")
If coco=1
FontBIG=LoadFont(#PB_Any,"BigDots",12)
Debug "Font BigDots OK"
Else
FontBIG=LoadFont(#PB_Any,"Microsoft Sans Serif",12)
Debug "M Sans Serif OK"
EndIf
Dans le debug la font BigDots est pourtant bien chargée.
Avez vous une idée du pourquoi de ce comportement ?
Re: Insertion de Fonts externes et includeBinary..
Publié : mar. 31/mai/2011 17:35
par venom
Salut,
je peut me tromper mais il me semble que si la Font n'est pas installer dans le dossier Font de windows ça ne fonctionnera pas.
A confirmer.
@++
Re: Insertion de Fonts externes et includeBinary..
Publié : mar. 31/mai/2011 18:03
par Ar-S
Tu te trompes,
Regarde dans les tuto j'en ai fait un sur le sujet justement.
Le truc c'est que si font externe dans dossier prog => ça marche
Si font externe extrait de l'exe dans dossier prog, => marche pas
Donc dans les 2 cas ma font est dans le dossier du prog. Mais dans le second cas, ça ne marche pas.
Re: Insertion de Fonts externes et includeBinary..
Publié : mar. 31/mai/2011 23:09
par graph100
et tu as testé avec une font que tu as extraite d'un exe, de la charger avec un autre exe qui ne l'extrait pas ?
tu as comparé les tailles de fichier ?
essayé de l'installé sur window ?
Re: Insertion de Fonts externes et includeBinary..
Publié : mer. 01/juin/2011 0:45
par Ar-S
Je ré-explique en essayant de détailler.
- Cas 1
Dans le répertoire il y a
prog.exe
font.ttf
Le cas 1 fonctionne.
- Cas 2
Dans le répertoire il y a
prog.exe qui contient en lui font.ttf
Lorsqu'on lance le prog.exe, on se retrouve comme dans le cas 1 mais la font ne s'affiche pas, pourtant le debug montre que PB l'a repéré.
Et si je prends la font extraite et que je remplace la font du cas 1 par celle ci, le cas 1 marche toujours.
D'où mon incompréhension.
P.S : Pas besoin que je l'installe dans windows, c'est même le but de ne pas l'installer.
Re: Insertion de Fonts externes et includeBinary..
Publié : mer. 01/juin/2011 8:28
par Jacobus
Essayes comme ça à tout hasard, il se peut que ce soit
GetCurrentDirectory() qui pose problème.
Ca m'arrive de temps en temps et j'utilise cette solution pour obtenir le realpath du répertoire.
Code : Tout sélectionner
Global FontBIG, currentdir.s, AppliDir$
currentdir.s = Space(#MAX_PATH)
GetModuleFileName_(GetModuleHandle_(0), @currentdir, #MAX_PATH)
AppliDir$ = GetPathPart(currentdir)
DataSection
fontuser:
IncludeBinary "datas/BigDots.ttf"
fontuser_end:
EndDataSection
If FileSize(AppliDir$+"BigDots.ttf") = -1
If CreateFile(0, AppliDir$+"BigDots.ttf")
WriteData(0, ?fontuser, ?fontuser_end - ?fontuser)
CloseFile(0)
EndIf
EndIf
;-////// CHARGEMENT DES FONTS /////////////////
coco=AddFontResource_(AppliDir$+"BigDots.ttf")
If coco=1
FontBIG=LoadFont(#PB_Any,"BigDots",12)
Debug "Font BigDots OK"
Else
FontBIG=LoadFont(#PB_Any,"Microsoft Sans Serif",12)
Debug "M Sans Serif OK"
EndIf
Re: Insertion de Fonts externes et includeBinary..
Publié : mer. 01/juin/2011 10:54
par gnozal
Attention aux confusions :
- GetCurrentDirectory() renvoie le répertoire courant (comme la commande cd en mode console).
- ProgramFilename() renvoie le chemin complet de l'exécutable.
Les deux informations sont indépendantes et pas forcément identiques !
Re: Insertion de Fonts externes et includeBinary..
Publié : mer. 01/juin/2011 12:22
par Ar-S
Rien ni fait, c'est vraiment étrange. je vais pas me prendre plus le choux, je vais fournir la "font" dans le dossier et basta.
J'ai perdu trop de temps avec cette broutille alors qu'un arial black a le même rendu..

Re: Insertion de Fonts externes et includeBinary..
Publié : mer. 01/juin/2011 12:31
par gnozal
Sur le sujet, j'ai quelques codes dans ma collection (Windows uniquement).
MSDN a écrit :AddFontResource Function
Any application that adds or removes fonts from the system font table should notify other windows of the change by sending a WM_FONTCHANGE message to all top-level windows in the operating system. The application should send this message by calling the SendMessage function and setting the hwnd parameter to HWND_BROADCAST.
When an application no longer needs a font resource that it loaded by calling the AddFontResource function, it must remove that resource by calling the RemoveFontResource function.
This function installs the font only for the current session. When the system restarts, the font will not be present. To have the font installed even after restarting the system, the font must be listed in the registry.
Code : Tout sélectionner
;
; AddFontMemResourceEx()
;
i.l = 1
notok = #True
If OpenLibrary(1, "Gdi32.dll")
proc.l = IsFunction(1, "AddFontMemResourceEx")
If proc
CallFunction(1, "AddFontMemResourceEx", ?font1_start, ?font1_end - ?font1_start, 0, @i)
notok = #False
EndIf
CloseLibrary(1)
EndIf
If notok
If CreateFile(0, "fixed_01.ttf")
WriteData(?font1_start, ?font1_end - ?font1_start)
CloseFile(0)
AddFontResource_("fixed_01.ttf")
SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0)
Else
MessageRequester("Fehler", "Konnte eine Resource nicht laden")
End
EndIf
EndIf
LoadFont(#fnt_small, "fixed_v01", 6)
;...
DataSection
font1_start:
IncludeBinary "Data\fixed_01.ttf"
font1_end:
EndDataSection
Code : Tout sélectionner
;
; AddFontResource
;
EnableExplicit
Define Result.l
Define i.l
Result = AddFontResource_("DIMITRI_.TTF")
SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0)
If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
EditorGadget(0, 8, 8, 306, 133)
For i = 0 To 5
AddGadgetItem(0,i,"Line "+Str(i))
Next
SetGadgetFont(0,LoadFont(0,"DIMITRI",10))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
RemoveFontResource_("DIMITRI_.TTF")
SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0)
Re: Insertion de Fonts externes et includeBinary..
Publié : mer. 01/juin/2011 12:40
par Ar-S
Merci pour ce code, je vais tester.
Par contre me manque la procédure IsFunction()
Re: Insertion de Fonts externes et includeBinary..
Publié : mer. 01/juin/2011 13:32
par gnozal
Ar-S a écrit :Merci pour ce code, je vais tester.
Par contre me manque la procédure IsFunction()
IsFunction() [PB3.9x] = GetFunction() [PB4.xx]