Page 1 sur 1

[Résolu] Mise à l'echelle automatique des caractères

Publié : ven. 29/nov./2013 9:41
par Fig
Sur mon nouveau Pc (encore, oui... Tout le monde le sais...) je suis en FullHD.
J'ai donc augmenté la taille de l'affichage dans le menu de windows.

Problème, certains de mes programmes affichent des éléments graphique de type image bmp et par dessus du texte.
Or, maintenant le texte est grossi !! Il dépasse !

Comment faire pour éviter que la mise à l’échelle windows influence la taille des caractères que je défini déjà en chargeant les polices (LoadFont (1, "impact", 20)) ?

Re: Mise à l'echelle automatique des carcatères

Publié : ven. 29/nov./2013 11:15
par Ar-S
C'est toujours une histoire de DPi qui change du fait ta taille d'affichage dans windows.
Il faudrait dimensionner tes textes et gadgets en fonction des DPi.

Petit code pour afficher le nbr de Dpi par Cm (windows seulement)

Code : Tout sélectionner

hdc = GetDC_(GetDesktopWindow_())
If hdc : dpiX.l = GetDeviceCaps_(hdc, #LOGPIXELSX) : ReleaseDC_(GetDesktopWindow_(), hdc) : EndIf

Debug "Desktop resolution: " + Str(dpiX) + " dpi"
Debug "Pixels par cm: " + StrD(dpiX / 2.54)

Re: Mise à l'echelle automatique des carcatères

Publié : ven. 29/nov./2013 15:06
par MLD
Oui ou pour avoir la définition de l'ecran
definecrltX.d = GetSystemMetrics_(#SM_CXSCREEN)
definecrltY.d = GetSystemMetrics_(#SM_CYSCREEN)
debug definecrltX.d
debug definecrltY.d

Re: Mise à l'echelle automatique des carcatères

Publié : ven. 29/nov./2013 15:32
par Mesa
Multiplateforme et tous DPI:

Code : Tout sélectionner

Global Arial24 
	 
	Arial24=LoadFont(1, "Arial", 24)  
	If Arial24=0 
	Debug "Erreur de police" 
	End 
	EndIf 
	 
	 
	Procedure NewTextWidth(texte$, police=-1, marge=0) 
	;police=-1 => Font sytem 
	Protected W 
	 
	 
	If CreateImage(0, 200,200) 
	StartDrawing(ImageOutput(0)) 
	If police <> -1  
	DrawingFont(police) 
	EndIf 
	W=TextWidth(texte$) + marge 
	StopDrawing() 
	Else 
	Debug "Erreur dans NewTextWidth()" 
	End 
	EndIf 
	FreeImage(0) 
	ProcedureReturn W 
	EndProcedure 
	 
	Procedure NewTextHeight(texte$, police=-1, marge=0) 
	;police=-1 => Font sytem 
	Protected H 
	 
	If CreateImage(0, 200,200) 
	StartDrawing(ImageOutput(0)) 
	If police <> -1  
	DrawingFont(police) 
	EndIf 
	H=TextHeight(texte$) + marge 
	StopDrawing() 
	Else 
	Debug "Erreur dans NewTextHeight()" 
	End 
	EndIf 
	FreeImage(0) 
	ProcedureReturn H 
EndProcedure 


If OpenWindow(0, 0, 0, 220, 200, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  longueur = NewTextWidth("Fermer")
  hauteur  = NewTextHeight("Fermer")
  ButtonGadget(0, 10, 20, longueur, hauteur, "Fermer")
 
  ButtonGadget(1, 10, 90, 200, 30, "Fermer")
  SetGadgetFont(1, Arial24) 
  ResizeGadget(1, #PB_Ignore, #PB_Ignore, NewTextWidth("Fermer", Arial24, 30), NewTextHeight("Fermer", Arial24, 10) ) 

   Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 0, 1 
              CloseWindow(0)
              End  
         EndSelect
            
     EndSelect
   Until Event = #PB_Event_CloseWindow
 EndIf

Mesa.

Re: Mise à l'echelle automatique des carcatères

Publié : ven. 29/nov./2013 17:00
par MLD
@Mesa
Bonjour
Si tu as la solution pour toutes les résolutions écrans avec tous les gadgets Je suis preneurs. :lol:
Fait un éssai avec ListIconeGadget, pour garder a lécran le même nombre de ligne, la même largeur de liste le tout parfaitement aligné
en 1280X800 puis en 1920X1080. C'est une autre paire de manche :mrgreen:
Car nous ne savons pas a l'avance ce que l'utilisateur final utilise comme écran?. La solution de lui imposer une définition basse est mauvaise car il trouvera le graphisme assez pourri. et une haute définition ne sera pas forcément compatible avec son écran. :cry:
J'ai ce problème pour chacun de mes logiciels. J'ai résolut le problème mais de façon relativement complexe, et pas forcément universel pour tous les logiciels. Alors si tu a la solution je prend :lol: :lol:

Re: Mise à l'echelle automatique des carcatères

Publié : ven. 29/nov./2013 23:32
par Fig
Je ne suis pas sur de mettre bien expliqué... je n'ai pas de problème avec le changement de résolution:

j'affiche une image de 400x400 pixels: elles a toujours le même nombre de pixels, et apparait comme plus petite forcément.
Quand j'écris sur cette image, avec une font de 28 par exemple, je m'attend à avoir la même taille de caractère proportionnellement à l'image, ca serait logique.
Ce n'est pas le cas depuis que j'ai passé l'affichage des éléments de windows à 125%. (Panneau de configuration\Apparence et personnalisation\Affichage\modifier taille des éléments 125%)

Mes caractères sont 25% plus grand !
Comment savoir si la personne qui exécute mon programme à forcé la mise à l'échelle ? Comment redonner la bonne taille au caractère ?

Re: Mise à l'echelle automatique des carcatères

Publié : sam. 30/nov./2013 0:31
par Backup
Fig a écrit :J
Comment savoir si la personne qui exécute mon programme à forcé la mise à l'échelle ? Comment redonner la bonne taille au caractère ?
Ar-s avait fait cette petite procedure pour connaitre le Pourcentage DPI choisi par l'utilisateur

Code : Tout sélectionner

Procedure.i GetDPI()
; by Ar-S
  HDC = GetDC_(0)
  DPI = GetDeviceCaps_(HDC, #LOGPIXELSX)
  ProcedureReturn DPI
EndProcedure

Debug GetDPI()
il ajoute :
Si le DPi est à 96, alors j'utilise les grosses fonts sinon je les diminues.
ça a l'air de passer...
avec ça tu peut tenir compte de ta fonte suivant le pourcentage DPI :)

Re: Mise à l'echelle automatique des carcatères

Publié : sam. 30/nov./2013 9:20
par Ar-S
Dobro a écrit :
Fig a écrit :J
Comment savoir si la personne qui exécute mon programme à forcé la mise à l'échelle ? Comment redonner la bonne taille au caractère ?
Ar-s avait fait cette petite procedure pour connaitre le Pourcentage DPI choisi par l'utilisateur

Code : Tout sélectionner

Procedure.i GetDPI()
; by Ar-S
  HDC = GetDC_(0)
  DPI = GetDeviceCaps_(HDC, #LOGPIXELSX)
  ProcedureReturn DPI
EndProcedure

Debug GetDPI()
il ajoute :
Si le DPi est à 96, alors j'utilise les grosses fonts sinon je les diminues.
ça a l'air de passer...
avec ça tu peut tenir compte de ta fonte suivant le pourcentage DPI :)
C'est le petit bout de code que je cherchais et que je ne trouvais plus :mrgreen:
à toi (Fig) de faire tes essayes.

Re: Mise à l'echelle automatique des caractères

Publié : sam. 30/nov./2013 12:18
par Fig
C'est exactement ce que je voulais, merci Dobro, Ars, Mesa :D

Re: Mise à l'echelle automatique des caractères

Publié : sam. 30/nov./2013 12:27
par Mesa
Le DPI reste toujours un problème, il y a un code, seulement pour Windows qui résout tout (dans mon souvenir).
http://www.purebasic.fr/english/viewtop ... 3%A5gensen

J'avais écrit un truc ici http://www.purebasic.fr/french/viewtopi ... 21&t=12634

Sinon, il faut réduire le texte en proportion du DPI. Ça marche dans la plupart des cas:
- DPI avec le code d'Ars
- pourcentage=DPI*100/96
- Réduire la taille de la police en proportion=T*100/pourcentage
T=10 pour Windows Xp et T=11 Pour Vista et suivant = Taille par défaut du système d'exploitation.
(je ne sais pas pour W8)

Par exemple
Avec un DPI=120
pourcentage=120*100/96=125% (on a bien un grossissement)
Avec Windows XP, la nouvelle taille de police (à diminuer pour que le texte rentre dans les gadgets) = 10 *100/125=8

Avec un DPI de 120, une taille 8 doit apparaitre comme une taille 10 en DPI normal(96).

Ça reste du bidouillage.

Mais j'ai l'impression que la bibliothèque "Dialog" de PB prend en compte le DPI (?). A voir.

M.