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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

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

Message 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)) ?
Dernière modification par Fig le sam. 30/nov./2013 18:38, modifié 2 fois.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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)
~~~~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
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

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

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

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

Message 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.
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

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

Message 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:
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

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

Message 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 ?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

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

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

Message 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.
~~~~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
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

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

Message par Fig »

C'est exactement ce que je voulais, merci Dobro, Ars, Mesa :D
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

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

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