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.
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
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
à 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

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.