Page 1 sur 2

DPI 2

Publié : mar. 09/juil./2019 14:29
par MLD
Bonjour a tous.

Ou je n'est rien compris (ce qui est possible) :oops: , ou il y a dysfonctionnement?

Code : Tout sélectionner

;testes DPI

Define hWndFP = OpenWindow(1,0,0,503,985,"XXXX",#PB_Window_MinimizeGadget)
StickyWindow(1,1)
TextGadget(2,12,20,45,17,"124589",#PB_Text_Center)
SetGadgetColor(2,#PB_Gadget_BackColor,$00FFFF)
TextGadget(3,57,20,45,17,"124589",#PB_Text_Center)
SetGadgetColor(3,#PB_Gadget_BackColor,$00A5FF)
EditorGadget (4,15,825,475,85,#PB_Editor_ReadOnly)
Repeat
  
  Event = WaitWindowEvent()
  
Until Event = #PB_Event_CloseWindow

Ce petit code a été réalisé avec un écran 1920 X 1080
Si je passe en 1280 X 800
avec ou sans cocher la case DPI du compilateur ceci ne change pratiquement rien et ne fonctionne pas, dans les deux cas l'EditorGadget est invisible.
Je fait appel a vous pour comprendre. :wink: :lol:
Merci

Re: DPI 2

Publié : mer. 10/juil./2019 8:27
par MLD
Apparemment ma question ne passionne pas les foules.
Je vais donc la poser différamment.
Quelqu’un utilise t’il le DPI de PB en cochant la case dans les préférences du compilateur, et avec quels résultats. :?: :roll:

Re: DPI 2

Publié : mer. 10/juil./2019 8:48
par Christophe
Bonjour MLD,
j'ai essayé, et chez moi avec la case DPI cochée ou pas l'EditorGadget Apparait dans la plus grande résolution
Par contre une chose m'intrigue... comment veux tu afficher ton EditorGaget à l'ecran si celui ci est en dehors de ta resolution ? il est en "y 825" alors que ton écran est limité a "y 800" ?

Re: DPI 2

Publié : mer. 10/juil./2019 9:10
par MLD
Bonjour Christophe
Pour moi le DPI awares sert justement a redimensionner la fenêtre et les gadgets en fonction des dimensions de l'écran.
Un logiciel doit pouvoir d’utilisé sur tous types d'ordis quelque soit la dimension de l'écran.
je pensait peut être naïvement :oops: :roll: que Fred avait inclus une biblio qui fait ce boulot nativement,. Mais ......

Re: DPI 2

Publié : mer. 10/juil./2019 9:19
par Ar-S
Et MLD si on te répond pas dans la foulée c'est qu'on est peut être occupé.
Je fais plein de testes concernant ta question entre 1000 trucs que j'ai à faire ici.
@Christophe. Son ecran est limité à 985, pas à 800 donc on devrait voir un bout de l'éditeur, qu'on soit en 100%, 125% ou 150%.

MLD tu te fourvoies.
Le DPI awar doit afficher le même prorata des éléments selon le DPI du systeme.
En aucun cas il s'adapte à la résolution

J'ai baissé le Y de la fenetre et de l'editor pour mes tests car je suis en QHD DPI 100 sur ma tour mais en HD DPI 125 sur le portable.

Avec le code suivant, essaye en cochant/decochant la case DPI aware

Code : Tout sélectionner

;testes DPI


DPI.d = DesktopResolutionX()



Macro DX(Size) 
    DesktopScaledX(Size)    
  EndMacro                 
  Macro DY(Size) 
    DesktopScaledY(Size)    
  EndMacro  




Define hWndFP = OpenWindow(1,0,0,DX(503),DY(685),"XXXX",#PB_Window_MinimizeGadget)
StickyWindow(1,1)
TextGadget(2,dx(12),dy(20),DX(45),DY(17),"124589",#PB_Text_Center)
SetGadgetColor(2,#PB_Gadget_BackColor,$00FFFF)
TextGadget(3,dx(57),dy(20),dx(45),dy(17),"124589",#PB_Text_Center)
SetGadgetColor(3,#PB_Gadget_BackColor,$00A5FF)
EditorGadget (4,dx(15),dY(525),DX(475),DY(85),#PB_Editor_ReadOnly)
Repeat
 
  Event = WaitWindowEvent()
 
Until Event = #PB_Event_CloseWindow
Normalement les dpi aware est utile pour les images (dans un canvas, ce qui est graphique). Mais tu verras avec ce test que les dimensions de la fenêtre changent.
A toi de voir selon de dpi si tu utilises DesktopUnscaled* ou Desktopscaled*

Re: DPI 2

Publié : mer. 10/juil./2019 9:36
par MLD
Ar-S
Merci de ta réponse.
Moi aussi j'ai des trucs a faire pour ce midi (Calamars a l'Armoricaine) .
Je te répond plus explicitement dans la journée.

Re: DPI 2

Publié : mer. 10/juil./2019 9:37
par Ar-S
J'ai complété ma réponse. Je vais étendre mon linge ^^

Re: DPI 2

Publié : mer. 10/juil./2019 9:49
par Marc56
Le DPI aware ne fait rien tout seul, il se contente de remonter le facteur de zoom utilisé par Windows.
À toi ensuite d'appliquer ce facteur de zoom aux objets avec les commandes comme DesktopScaledX() :arrow: F1
La case à cocher ne sert qu'à activer les fonctions dans le programme.

:idea: Pour faire des tests, pas besoin de deux machines:
- Soit deux moniteurs sur le même PC Windows et tu mets un facteur de zoom différent pour chaque (possible, même en mode bureau étendu)
- Soit tu installes un autre Windows dans une machine virtuelle (Virtual Box, très facile)

Pas d'illusion, c'est assez compliqué de bien gérer une application multi-DPI (et ça doit l'être encore plus niveau compilateur, sans oublier les 3 OS), c'est peut être pour cela que la 5.71 traîne depuis des mois.

:wink:

Re: DPI 2

Publié : mer. 10/juil./2019 10:05
par Ar-S
Marc56 a écrit :Pour faire des tests, pas besoin de deux machines:
ça va de soit. :wink:
(Mais j'en ai deux via teamviewer, je peux dis, je peux ? :mrgreen: )

Re: DPI 2

Publié : mer. 10/juil./2019 10:30
par Marc56
Ce n'était pas pour toi, je me doute que tu connais :P
C'était pour ceux qui jonglent avec deux PC juste pour tester 8)

Re: DPI 2

Publié : mer. 10/juil./2019 10:38
par Christophe
Son ecran est limité à 985, pas à 800 donc on devrait voir un bout de l'éditeur, qu'on soit en 100%, 125% ou 150%.
@Ar-s je ne comprends pas trop ton raisonnement, il affiche bien une fenetre de 985 mais comme son moniteur est réglé sur 800 comment peux t-il voir sa fenetre complete ? son editeur et en 825
Je ne comprends peux etre pas bien les DPI... :roll:

Re: DPI 2

Publié : mer. 10/juil./2019 13:06
par MLD
Bon comme je le craignais la case DPI de PB c'est comme la dame qui te dit tu as vue c'est du 95C. Tu peux regarder , mais pas toucher. :oops: 8O
Pour moi utilisé le DPI c'est ce que fait le code ci-dessous. (Attention surtout ne pas cocher la case DPI de PB) :lol:

Code : Tout sélectionner

;¤¤¤¤¤¤¤ Le DPI Vue de ma fenêtre ¤¤¤¤¤¤¤¤¤¤

;¤¤¤¤¤¤¤ DPI ¤¤¤¤¤¤¤¤
#Ldef = 1920:#Hdef = 1080 
Global definecrlarg.d = GetSystemMetrics_(#SM_CXSCREEN)
Global definecrht.d = GetSystemMetrics_(#SM_CYSCREEN)

Procedure X(lg.d)
  ProcedureReturn lg *(definecrlarg.d/#Ldef)
EndProcedure

Procedure Y(h.d)
  ProcedureReturn h *(definecrht.d /#Hdef) 
EndProcedure
Global FontID1 = LoadFont(10,"Noto Serif Condensed",X(10),0|0|0|0|0)
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
Macro Ecrit(gad)
  SetGadgetFont(gad,FontID1)
EndMacro
Define hWndFP = OpenWindow(1,X(0),Y(10),X(503),Y(985),"XXX",#PB_Window_MinimizeGadget)
StickyWindow(1,1)
TextGadget(2,X(12),Y(20),X(45),Y(17),"124589",#PB_Text_Center)
SetGadgetColor(2,#PB_Gadget_BackColor,$00FFFF)
TextGadget(3,X(57),Y(20),X(45),Y(17),"124589",#PB_Text_Center)
SetGadgetColor(3,#PB_Gadget_BackColor,$00A5FF)
EditorGadget (4,X(15),Y(825),X(475),Y(85),#PB_Editor_ReadOnly)
For F = 2 To 4
  Ecrit(F)
Next  
Repeat
  
  Event = WaitWindowEvent()
  
Until Event = #PB_Event_CloseWindow
C'est Marc 56 qui m'a mis un peu la puce a l'oreille, et fait comprendre que cette fonction est un peu PIPO :mrgreen:
Le code ci- dessus n'est certainement pas parfait, mais ce devrais progresser.
Mais il est possible que je me mélange les pinceaux avec les termes concernant le DPI awares. Qui pour moi je le répète doit être un logiciel doit fonctionner sur toutes les machines quelque soit les définitions de l'écran.
J'aimerais recueillir vos commentaires sur cette façon de faire.
Encore merci a tous.
@ Ar-s vu la température de l'air depuis ce matin PB m'indique que ton linge est sec. :roll: :oops: :lol:

Re: DPI 2

Publié : mer. 10/juil./2019 13:48
par Marc56
cette fonction est un peu PIPO
Naaaaaaannnn :( :D

C'est simplement que si tu ne coches pas la case DPI aware dans le compilateur, alors le coefficient multiplicateur de zoom (utilisé par les fonctions DesktopScaledX, DesktopScaledY, DesktopUnscaledX, DesktopUnscaledY) sera égal à 1 même si l'utilisateur n'est pas à 100%.

Autrement dit, cela te permet de faire une même application et de la compiler en version auto-redim ou pas étant donné que ton code ne change pas (multiplier ou diviser les gadgets par 1 ne change pas leur taille). Il suffit juste de faire deux compilation avec la case cochée ou pas.

Cela ne concerne pas la résolution écran si tu la change (car c'est déconseillé de mettre un écran LCD autrement qu'à sa résolution native: c'est moche alors que le zoom (100, 125, 150) ne va zoomer que les éléments demandés.

Lire là (et les remarques)
https://www.purebasic.com/french/docume ... aledx.html

@ Ar-s : avec cette température, je mets sur essorage moins rapide et je fais sécher dedans (dans le courant d'air). Ça fait une clim cheap' mais efficace.

8)

Re: DPI 2

Publié : mer. 10/juil./2019 14:40
par MLD
OK Marc
Mais il ne sagit pas de changer la résolution de l'écran sur une même machine, mais de changer de machine avec le même logiciel.
Mais par exemple de faire tourné le logiciel sur une tour avec un écran 1920 X 1080, et ce même logiciel sur un portable 1280 X800
Avec le code ci-dessus ceci fonctionne parfaitement.
Si ce n'est pas comme cela, comment fait tu?

Re: DPI 2

Publié : mer. 10/juil./2019 16:06
par Ar-S
MLD ne confonds pas la résolution d'ecran et d'interface avec le ZOOM utilisé par les OS sur les ordi à "petit" ecran. Certains ont un affichage normal : 100% et d'autres un affichage 125% voir 150% (plus rare).

Exemple :
Sur un OS en 1920 x 1080 avec un DPI de 100, Si tu as un canvas de largeur 100 avec une image de largeur 100... Tu auras ton affichage nickel.
Sur un OS en 1920 x 1080 avec un DPI de 125, Ton canvas et tes gadgets vont s'adapter MAIS ton image ne prendra pas toute la place du canvas, car ton canvas aura pris la dimension 125 mais pas l'image. D'ou la doc qui dit :
Cette option active la détection DPI lors de la création d'un exécutable. Cela signifie que l'interface graphique créée dans PureBasic sera automatiquement redimensionnée si le DPI de l'écran est supérieur à 100%. Ce processus se fait généralement sans problèmes, mais certains cas doivent être résolus de façon spécifique, tels que les gadgets qui manipulent des pixels (ImageGadget, CanvasGadget, etc.).
Donc tu devras en amont de ton affichage, tester le DPI de l'OS et faire un resizeimage(x,DesktopScaledx(tailleimageX),DesktopScaledy(tailleimageY)) si DPI > 100

Donc ton code est ok pour adapter un affichage "proportionnelle" par rapport aux desktop, mais pas par rapport au DPI.
J'espère que c'est plus claire pour toi.