Page 1 sur 1
Ajustement Font DPI Toutes plateformes PB 5.40 [Très Simple]
Publié : mar. 15/sept./2015 23:53
par nico
Vu sur un autre langage, exemple pour purebasic.
La 5.40 nous permet de récupérer le DPI de l'écran et donc d'adapter la police en conséquence.
Dans le 1er exemple, vous ne verrez une différence après avoir cliqué sur le bouton que si votre DPI est différent de 96.
Précision : GetFactorDPI(ref.f=96) ; le ref ici qui est de 96 n'est pas une valeur par défaut mais correspond au DPI utilisé lors de la création du programme, mon DPI actuel est de 120, j'ai donc ajusté mon écran à 96 DPI (nécessite fermeture/réouverture de session) et ensuite créer le programme.
Si votre DPI est de 96, exécuter le deuxième code; le Ref est de 120 sur ce deuxième code, ce qui signifie donc que je l'ai créer avec un écran de 120 DPI au moment de la programmation.
Le Debug vous indiquera votre DPI ainsi que le coefficient multiplicateur.
Code : Tout sélectionner
; ref=96 correspond au DPI de l'écran au moment de la programmation
Procedure.f GetFactorDPI(ref.f=96)
Protected Factor.f
If StartVectorDrawing(WindowVectorOutput(0))
Factor = ref / VectorResolutionX()
StopVectorDrawing()
EndIf
Debug Factor
ProcedureReturn Factor
EndProcedure
If OpenWindow(#Window, 0, 0, 400, 200, "Ajustement de la taille de la police", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SizeFont.l = 12
LoadFont(1, "Arial", SizeFont)
SetGadgetFont(#PB_Default, FontID(1))
ButtonGadget(#Button,20,80,360,26, "Ajustement de la taille de la police de caractères")
Repeat
Event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case 0
ScaleFont.l = SizeFont * GetFactorDPI()
Debug ScaleFont
LoadFont(1, "Arial", ScaleFont)
SetGadgetFont(0, FontID(1))
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
Code : Tout sélectionner
; ref=120 correspond au DPI de l'écran au moment de la programmation
Procedure.f GetFactorDPI(ref.f=120)
Protected Factor.f
If StartVectorDrawing(WindowVectorOutput(0))
Factor = ref / VectorResolutionX()
StopVectorDrawing()
EndIf
Debug Factor
ProcedureReturn Factor
EndProcedure
If OpenWindow(#Window, 0, 0, 400, 200, "Ajustement de la taille de la police", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SizeFont.l = 10
LoadFont(1, "Arial", SizeFont)
SetGadgetFont(#PB_Default, FontID(1))
ButtonGadget(#Button,20,80,360,26, "Ajustement de la taille de la police de caractères")
Repeat
Event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case 0
ScaleFont.l = SizeFont * GetFactorDPI()
Debug ScaleFont
LoadFont(1, "Arial", ScaleFont)
SetGadgetFont(0, FontID(1))
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : mer. 16/sept./2015 0:23
par nico
Des exemples ci-dessous:
Pour trouver son DPI:
Code : Tout sélectionner
Procedure.l GetDPI(Window.i)
Protected DPI.l
If StartVectorDrawing(WindowVectorOutput(Window))
DPI = VectorResolutionX()
StopVectorDrawing()
EndIf
ProcedureReturn DPI
EndProcedure
Enumeration
#Window
EndEnumeration
If OpenWindow(#Window, 0, 0, 400, 200, "Obtenir son DPI", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Debug GetDPI(#Window)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Un exemple concret qui va automatiquement adapté la Font au DPI de l'utilisateur sans intervention:
Code : Tout sélectionner
; renseigner le DPI de l'écran, DPIdevotreEcran =
Procedure.f GetFactorDPI(Window.i, DPIdevotreEcran.f=??)
Protected Factor.f
If StartVectorDrawing(WindowVectorOutput(Window))
; Le debug doit vous renvoyer la même valeur que DPIdevotreEcran
; si vous l'avez bien renseigné
Debug VectorResolutionX()
Factor = DPIdevotreEcran / VectorResolutionX()
StopVectorDrawing()
EndIf
; le debug doit renvoyer 1
Debug Factor
ProcedureReturn Factor
EndProcedure
Enumeration
#Window
EndEnumeration
Enumeration
#Button
EndEnumeration
Enumeration
#Arial
EndEnumeration
If OpenWindow(#Window, 0, 0, 400, 200, "Adaptation automatique de la police", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; SizeFont sera a modifier pour que le texte s'affiche tel que vous le souhaitez
; ici c'est pour l'exemple, qui fonctionne pour moi correspondant a mon DPI actuel qui est de 120
SizeFont.l = 10
ScaleFont.l = SizeFont * GetFactorDPI(#Window)
LoadFont(#Arial, "Arial", ScaleFont)
SetGadgetFont(#PB_Default, FontID(#Arial))
ButtonGadget(#Button,20,80,360,26, "Ajustement de la taille de la police de caractères")
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Deuxième exemple:
Code : Tout sélectionner
; renseigner le DPI de l'écran, DPIdevotreEcran =
Procedure.f GetFactorDPI(Window.i, DPIdevotreEcran.f=??)
Protected Factor.f
If StartVectorDrawing(WindowVectorOutput(Window))
; Le debug doit vous renvoyer la même valeur que DPIdevotreEcran
; si vous l'avez bien renseigné
Debug VectorResolutionX()
Factor = DPIdevotreEcran / VectorResolutionX()
StopVectorDrawing()
EndIf
; le debug doit renvoyer 1
Debug Factor
ProcedureReturn Factor
EndProcedure
Enumeration
#Window
EndEnumeration
Enumeration
#String
#Button
EndEnumeration
Enumeration
#Verdana
#Arial
EndEnumeration
If OpenWindow(#Window, 0, 0, 400, 200, "Adaptation automatique de la police", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; SizeFont sera a modifier pour que le texte s'affiche tel que vous le souhaitez
; ici c'est pour l'exemple, qui fonctionne pour moi correspondant a mon DPI actuel qui est de 120
SizeFont.l = 14
ScaleFont.l = SizeFont * GetFactorDPI(#Window)
LoadFont(Verdana, "Verdana", ScaleFont)
; en contractant, ça donne:
; LoadFont(Verdana, "Verdana", 14 * GetFactorDPI(#Window))
SizeFont.l = 10
ScaleFont.l = SizeFont * GetFactorDPI(#Window)
LoadFont(#Arial, "Arial", ScaleFont)
; en contractant, ça donne:
; LoadFont(#Arial, "Arial", 10 * GetFactorDPI(#Window))
StringGadget(#String,50,20,300,32, "[-------PureBasic-------]")
ButtonGadget(#Button,20,80,360,26, "Ajustement de la taille de la police de caractères")
SetGadgetFont(#String, FontID(#Verdana))
SetGadgetFont(#Button, FontID(#Arial))
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : mer. 16/sept./2015 0:25
par Ar-S
Petite coquille 1ere ligne commenté : ref=90 => ref=96
Cool en tout cas pour la commande GetFactorDPI
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : mer. 16/sept./2015 0:26
par nico
Corrigé, merci.
[Edit] J'ai souvent été confronté à ce problème lors de test de code source sur le Forum car j'ai un PC portable 17 pouces avec une résolution de 1920 * 1080; j'ai donc modifié la taille de tous les éléments à 125% pour y voir plus clair, ce qui me donne un DPI de 120 au final et de 96 par défaut.
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : mer. 16/sept./2015 8:33
par Mesa
Excellent, je vais mettre un ou deux exemples dans la doc.
M.
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : mer. 16/sept./2015 18:09
par nico
[Update]J'ai modifié la taille du bouton pour que ce soit plus visible et ajouter un second exemple.
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : sam. 05/déc./2015 15:48
par Ar-S
Je viens de passer mon affichage en 125% pour tester sous W10
si le texte et la taille des fonts parait adaptée, le debug m'affiche tjrs 96dpi.
j'avais modifié un peu le code pour ne pas à avoir à inscrire le dpi.
J'ai l’impression que windows zoom tout le bureau à 125% et non la font (ce qui expliquerait que la valeur ne change pas)
Code : Tout sélectionner
Procedure.l GetDPI(Window.i)
Protected DPI.l
If StartVectorDrawing(WindowVectorOutput(Window))
DPI = VectorResolutionX()
StopVectorDrawing()
EndIf
ProcedureReturn DPI
EndProcedure
Procedure.f GetFactorDPI(Window.i)
Protected Factor.f, DPI.l
DPI = GetDPI(Window)
If StartVectorDrawing(WindowVectorOutput(Window))
; Le debug doit vous renvoyer la même valeur que DPIdevotreEcran
; si vous l'avez bien renseigné
Debug VectorResolutionX()
Factor = DPI / VectorResolutionX()
StopVectorDrawing()
EndIf
; le debug doit renvoyer 1
Debug Factor
ProcedureReturn Factor
EndProcedure
Enumeration
#Window
EndEnumeration
Enumeration
#String
#Button
EndEnumeration
Enumeration
#Verdana
#Arial
EndEnumeration
If OpenWindow(#Window, 0, 0, 400, 200, "Adaptation automatique de la police", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; SizeFont sera a modifier pour que le texte s'affiche tel que vous le souhaitez
; ici c'est pour l'exemple, qui fonctionne pour moi correspondant a mon DPI actuel qui est de 120
SizeFont.l = 14
ScaleFont.l = SizeFont * GetFactorDPI(#Window)
LoadFont(Verdana, "Verdana", ScaleFont)
; en contractant, ça donne:
; LoadFont(Verdana, "Verdana", 14 * GetFactorDPI(#Window))
SizeFont.l = 10
ScaleFont.l = SizeFont * GetFactorDPI(#Window)
LoadFont(#Arial, "Arial", ScaleFont)
; en contractant, ça donne:
; LoadFont(#Arial, "Arial", 10 * GetFactorDPI(#Window))
StringGadget(#String,50,20,300,32, "[-------PureBasic-------]")
ButtonGadget(#Button,20,80,360,26, "Ajustement de la taille de la police de caractères")
SetGadgetFont(#String, FontID(#Verdana))
SetGadgetFont(#Button, FontID(#Arial))
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : sam. 05/déc./2015 18:10
par nico
Le code que tu as posté ne peut pas fonctionner, tu auras toujours un facteur de 1.
Je n'ai pas Window 10, peut être gère t'il les choses différemments, si tu as toujours un dpi de 96 avant et après; Falsam dit ne pas rencontrer de problème sur ACME sur Window 10.
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : sam. 05/déc./2015 18:42
par Ar-S
donc pour bien faire il faudrait prendre le dpi 100% ?
remplacer
Code : Tout sélectionner
Factor = DPI / VectorResolutionX()
par
Factor = 96 / VectorResolutionX()
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : dim. 06/déc./2015 13:37
par nico
C'est comme dans l'exemple, tu met ton DPI et tu n'y touche plus, en général 96 ou 120:
Si tu partages un code source avec ce code, tu laisses ton DPI et celui qui l'utilises n'a pas à le modifier, la font s'adapteras.
Ici, 96 est ton DPI de ton écran (celui de ton écran au moment de l'exécution du code), si tu programmes sur un écran avec une valeur DPI différente, à ce moment là tu le changes et si tu partages ton code tu laisses la valeur de ton DPI et il n'a pas a être changé.
Ici ref est un argument optionnel, au moment de l'appel tu peux la modifier en faisant ScaleFont.l = SizeFont * GetFactorDPI(120) et ainsi laisser la procédure telle quelle sans avoir à la modifier.
Procedure.f GetFactorDPI(ref.f=96)
Protected Factor.f
If StartVectorDrawing(WindowVectorOutput(0))
Factor = ref / VectorResolutionX()
StopVectorDrawing()
EndIf
Debug Factor
ProcedureReturn Factor
EndProcedure
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : mar. 08/déc./2015 10:50
par Mesa
Suivant le cas, on peut aussi prendre le problème à l'envers et utiliser:
Resultat = GadgetWidth(#Gadget , #PB_Gadget_RequiredSize)
voir ici
http://forum.purebasic.com/english/view ... 13&t=56350
voir aussi,la bibliothèque Dialog, qui ne fait pas fortune...
M.
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : ven. 25/déc./2015 21:40
par nico
Oui mais c'est plus compliqué, parce que ça ne redimensionne que le gadget et faut tout recalculer pour ce qui suit derrière pour que tout s'affiche ou alors faut laisser de la marge encore que pour la disposition des alignements des gadgets? Je ne sais pas, pas encore utilisé.
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : mar. 05/janv./2016 11:51
par Mesa
D'après l'interview
http://www.purearea.net/pb/english/interview_2015.htm récente de Fred et Timo, ce "fichu" problème de la gestion du DPI serait dans les cartons...
Y a plus qu'à attendre donc.
Sinon, en attendant, la bibliothèque 'Dialog' est faite pour pallier à ce problème.
Malheureusement, elle ne gère pas les fonts
J'avais proposé une début de soluce ici:
http://www.purebasic.fr/french/viewtopi ... =6&t=14020
Cette bibliothèque utilise les 'layout' (boîte de redimensionnement).
Le principe étant de préparer le travail en amont, poser les boîtes de redimensionnement puis de remplir ces boîtes avec des gadgets sans se soucier de leur position x,y ni de leurs tailles.
Avant que cette bibliothèque n'arrive, j'avais fait un tuto sur les 'layout' en utilisant un 'pbi' d'un pbsien. En le lisant, tu comprendras l’utilisation des 'layout' et donc de la bibli 'Dialog'.
http://www.purebasic.fr/french/viewtopi ... 21&t=12865
Mesa.
Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim
Publié : mar. 05/janv./2016 14:24
par djes
C'est marrant, 23 ans après, on va peut-être faire quelque chose du niveau de
MUI. Ou du
Display PostScript, presque 30 ans plus tard !