Ajustement Font DPI Toutes plateformes PB 5.40 [Très Simple]

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Ajustement Font DPI Toutes plateformes PB 5.40 [Très Simple]

Message 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
Dernière modification par nico le mer. 16/sept./2015 15:30, modifié 4 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message 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
Dernière modification par nico le mer. 16/sept./2015 15:52, modifié 10 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message par Ar-S »

Petite coquille 1ere ligne commenté : ref=90 => ref=96
Cool en tout cas pour la commande GetFactorDPI
~~~~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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message 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.
Mesa
Messages : 1097
Inscription : mer. 14/sept./2011 16:59

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message par Mesa »

Excellent, je vais mettre un ou deux exemples dans la doc.

M.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message par nico »

[Update]J'ai modifié la taille du bouton pour que ce soit plus visible et ajouter un second exemple.
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message 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
~~~~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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

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

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message 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()
~~~~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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message 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
Mesa
Messages : 1097
Inscription : mer. 14/sept./2011 16:59

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message 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é.
Mesa
Messages : 1097
Inscription : mer. 14/sept./2011 16:59

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

Message 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.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Ajustement Font DPI Toutes plateformes PB 5.40 [Très Sim

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