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, :mrgreen:
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]