Insertion de Fonts externes et includeBinary..

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9546
Inscription : dim. 09/oct./2005 16:51
Contact :

Insertion de Fonts externes et includeBinary..

Message 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 ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
venom
Messages : 3159
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Insertion de Fonts externes et includeBinary..

Message 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.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Ar-S
Messages : 9546
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Insertion de Fonts externes et includeBinary..

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Insertion de Fonts externes et includeBinary..

Message 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 ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9546
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Insertion de Fonts externes et includeBinary..

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Jacobus
Messages : 1579
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Insertion de Fonts externes et includeBinary..

Message 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
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: Insertion de Fonts externes et includeBinary..

Message 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 !
Avatar de l’utilisateur
Ar-S
Messages : 9546
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Insertion de Fonts externes et includeBinary..

Message 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.. :?
Dernière modification par Ar-S le mer. 01/juin/2011 12:32, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: Insertion de Fonts externes et includeBinary..

Message 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)
Avatar de l’utilisateur
Ar-S
Messages : 9546
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Insertion de Fonts externes et includeBinary..

Message par Ar-S »

Merci pour ce code, je vais tester.

Par contre me manque la procédure IsFunction()
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: Insertion de Fonts externes et includeBinary..

Message 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]
Répondre