[Résolu] Mise à l'echelle automatique des caractères
[Résolu] Mise à l'echelle automatique des caractères
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)) ?
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
Version de PB : 6.00LTS - 64 bits
Re: Mise à l'echelle automatique des carcatères
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)
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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
Re: Mise à l'echelle automatique des carcatères
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
definecrltX.d = GetSystemMetrics_(#SM_CXSCREEN)
definecrltY.d = GetSystemMetrics_(#SM_CYSCREEN)
debug definecrltX.d
debug definecrltY.d
Re: Mise à l'echelle automatique des carcatères
Multiplateforme et tous DPI:
Mesa.
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
Re: Mise à l'echelle automatique des carcatères
@Mesa
Bonjour
Si tu as la solution pour toutes les résolutions écrans avec tous les gadgets Je suis preneurs.
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
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.
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

Bonjour
Si tu as la solution pour toutes les résolutions écrans avec tous les gadgets Je suis preneurs.

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

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.

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


Re: Mise à l'echelle automatique des carcatères
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 ?
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
Version de PB : 6.00LTS - 64 bits
Re: Mise à l'echelle automatique des carcatères
Ar-s avait fait cette petite procedure pour connaitre le Pourcentage DPI choisi par l'utilisateurFig 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 ?
Code : Tout sélectionner
Procedure.i GetDPI()
; by Ar-S
HDC = GetDC_(0)
DPI = GetDeviceCaps_(HDC, #LOGPIXELSX)
ProcedureReturn DPI
EndProcedure
Debug GetDPI()
avec ça tu peut tenir compte de ta fonte suivant le pourcentage DPISi le DPi est à 96, alors j'utilise les grosses fonts sinon je les diminues.
ça a l'air de passer...

Re: Mise à l'echelle automatique des carcatères
C'est le petit bout de code que je cherchais et que je ne trouvais plusDobro a écrit :Ar-s avait fait cette petite procedure pour connaitre le Pourcentage DPI choisi par l'utilisateurFig 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 ?
il ajoute :Code : Tout sélectionner
Procedure.i GetDPI() ; by Ar-S HDC = GetDC_(0) DPI = GetDeviceCaps_(HDC, #LOGPIXELSX) ProcedureReturn DPI EndProcedure Debug GetDPI()
avec ça tu peut tenir compte de ta fonte suivant le pourcentage DPISi le DPi est à 96, alors j'utilise les grosses fonts sinon je les diminues.
ça a l'air de passer...

à 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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
Re: Mise à l'echelle automatique des caractères
C'est exactement ce que je voulais, merci Dobro, Ars, Mesa 

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
Version de PB : 6.00LTS - 64 bits
Re: Mise à l'echelle automatique des caractères
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.
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.