Question de DPI - A l'aide SVP

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Question de DPI - A l'aide SVP

Message par cage »

Bonsoir,

J'aurais besoin de votre aide pour maitriser cette histoire de DPI.
Je sais construire une application qui aura toujours la même taille de fenêtres et de polices quelque soit le facteur d'échelle choisi (100%, 125%, 150%, ...), mais
si l'utilisateur utilise un facteur de 150% et exécute l'application, l'affichage de l'application est correct, mais
si l'utilisateur change de facteur d'échelle, par exemple 175%, l'affichage de l'application n'est plus correct.
Je n'arrive pas a retrouver la nouvelle valeur de l'échelle pour actualiser l'affichage de l'application.
Un exemple avec le code suivant:

Code : Tout sélectionner

;;; L'option 'Enable DPI aware executable (Windows and macOS)' doit être cochée."
EnableExplicit
#WinApp=1
Global X=300, Y=200
Define Event

Procedure.a SizeWindow()
  Debug "EVENT SIZE WINDOWS"
  Protected DC = GetDeviceCaps_(GetDC_(0),#LOGPIXELSX)
  Debug "DC = " + DC
  Debug "SX = " + DesktopScaledX(X)
  Debug "SY = " + DesktopScaledY(Y)
  Protected XDPI.d = DesktopResolutionX() : Debug "XDPI = " + XDPI
  Protected YDPI.d = DesktopResolutionY() : Debug "YDPI = " + YDPI
  Debug ""
  ResizeWindow(#WinApp,#PB_Ignore,#PB_Ignore,DesktopScaledX(X), DesktopScaledY(Y))
EndProcedure

#FLAGS = #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget

If OpenWindow(#WinApp, 0, 0, DesktopScaledX(X), DesktopScaledY(Y), "Test DPI", #FLAGS)
  SetWindowColor(#WinApp, #Black)
  SmartWindowRefresh(#winApp, #True)
  
  BindEvent(#PB_Event_SizeWindow, @sizeWindow())
  
  Repeat
    Event = WaitWindowEvent(50)
  Until Event = #PB_Event_CloseWindow
  
EndIf
Une fois l'application lancée, il n'est plus possible de trouver la valeur d'échelle utilisée.
Changez le facteur d'échelle avec l'application lancée, et les résultats sont visibles dans le débogage lorsque vous essayez de changer la taille de la fenêtre.

Votre aide serez la bienvenue.
Merci a vous.

cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Question de DPI - A l'aide SVP

Message par Jacobus »

Salut cage, l'impression que tu aimes bien te prendre la tête.
Avec la méthode ci-dessous normalement tout est automatisé.

Code : Tout sélectionner

Enumeration
  #WinApp
  #Explorer
EndEnumeration
Global XDPI.d = DesktopResolutionX()
Global YDPI.d = DesktopResolutionY()

Procedure SizeWindow()
  WinWidth  = WindowWidth(#WinApp,#PB_Window_InnerCoordinate)
  WinHeight = WindowHeight(#WinApp,#PB_Window_InnerCoordinate)
  ResizeGadget(#Explorer,#PB_Ignore,#PB_Ignore,WinWidth-20,WinHeight-20)
EndProcedure

#FLAGS = #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_SystemMenu|#PB_Window_MaximizeGadget
If OpenWindow(#WinApp, 0, 0, 800*XDPI, 600*YDPI, "Test DPI", #FLAGS)
  WindowBounds(#WinApp, 800, 600, #PB_Ignore,#PB_Ignore) 
  SetWindowColor(#WinApp, #Black)
  ExplorerListGadget(#Explorer,10,10,780*XDPI,580*YDPI,GetHomeDirectory(),#PB_Explorer_NoDriveRequester|#PB_Explorer_NoSort)  
  BindEvent(#PB_Event_SizeWindow, @sizeWindow())  
  Repeat
    Event = WaitWindowEvent()   
  Until Event = #PB_Event_CloseWindow
  End 
EndIf
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Question de DPI - A l'aide SVP

Message par cage »

Bonsoir,
@ Jacobus, merci pour ta réponse.

Le problème est que toutes les commandes DesktopResolutionY(), DesktopScaledX(), DesktopScaledY(), DesktopUnscaledX(), DesktopUnscaledY() ne fonctionnent qu'au lancement de l'application.
Une fois lancée, imaginons un lecteur Radio développé en PB, tu écoute une station et tu réduis l'application dans la barre des tâches.
Puis tu modifies le facteur d'échelle de 100% a 150% pour utiliser confortablement une application de gestion quelconque.
Puis tu ré-affiches le lecteur Radio dont l'affichage a grandi d'un facteur de 1.5
Tu cliques sur un menu ou bouton de la Radio pour qu'il reprenne une taille normale.
Comment fait tu pour trouver le DPI qui est passé de 100 a 150
Aucune des commandes citées ci-dessus ne donnent la nouvelle valeur du DPI, tu obtiendras toujours la valeur du DPI au lancement de l'application.
J'ai créé un GetDPI.exe que j'appelle depuis mon application et qui me donne toujours la valeur actuelle du DPI
Même si ça fonctionne correctement, c'est toujours un exécutable en plus et s'il est effacé, ça ne fonctionne plus.

Alors oui, je me prends la tête, mais c'est pour la bonne cause.

Ce que j'essaye de faire, c'est une application qui ne change pas de taille quand on modifie le DPI et dont toutes les polices restent a peu près a la même taille.

Si tu sais me donner la commande PB qui vas bien, s'en aller lire la bdr ni utiliser les API, je suis preneur et en plus je te paye une bière. Pardon, il ne faut pas parler argent. :oops:

cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Question de DPI - A l'aide SVP

Message par Jacobus »

Dans ces conditions le plus simple pour toi est de détecter le changement d'échelle dans la boucle d'évènements, ou à l'aide d'un timer par exemple qui contrôle toutes les x secondes, et le cas échéant d'afficher un message à l'utilisateur pour qu'il redémarre l'application. Dans tous les cas il faut redessiner la fenêtre, donc sans l'API...

Un exemple vite fait, à adapter:

Code : Tout sélectionner

Enumeration
  #WinApp
  #Explorer
EndEnumeration

; ici on stocke la résolution de départ
Global InitDPIx.d = DesktopResolutionX()
Global InitDPIy.d = DesktopResolutionY()
;que l'on applique à la fenêtre
Global XDPI.d = InitDPIx.d
Global YDPI.d = InitDPIy.d

  Debug "Resolution initiale :"
  Debug "XDPI = "+ StrD(XDPI,2) 
  Debug "YDPI = "+ StrD(YDPI,2)
  Debug "=========================="
  
;Procedure de contrôle permanent du facteur DPI
Procedure CurrentDPI()
  
  CurDPIx.d = DesktopResolutionX()
  CurDPIy.d = DesktopResolutionY()
  
  Debug "Resolution courante :"
  Debug "CurDPIx = "+ StrD(CurDPIx,2) 
  Debug "CurDPIy = "+ StrD(CurDPIy,2)
  Debug "=========================="
  
  If CurDPIx <> InitDPIx Or CurDPIy <> InitDPIy
    
    XDPI = CurDPIx
    
    XDPI = CurDPIy
    
    RedrawWIN = MessageRequester("Affichage","L'échelle d'affichage de votre écran a changé. Pour continuer à utiliser NomApplication, vous devez le/la redémarrer."+Chr(10)+"Voulez-vous redémarrer NomApplication maintenant ?",#PB_MessageRequester_YesNo|#PB_MessageRequester_Info)
    ;si oui, on ferme la fenêtre et on relance le programme
    If RedrawWIN = 6
      Debug "Fermeture pour redémarrage..."
      CloseWindow(#WinApp)
      ; RunProgram("NomApplication.exe") 
    EndIf 
    
  EndIf 
  
EndProcedure
Procedure SizeWindow()
  WinWidth  = WindowWidth(#WinApp,#PB_Window_InnerCoordinate)
  WinHeight = WindowHeight(#WinApp,#PB_Window_InnerCoordinate)
  ResizeGadget(#Explorer,#PB_Ignore,#PB_Ignore,WinWidth-20,WinHeight-20)
EndProcedure

#FLAGS = #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_SystemMenu|#PB_Window_MaximizeGadget
If OpenWindow(#WinApp, 0, 0, 800*XDPI, 600*YDPI, "Test DPI", #FLAGS)
  WindowBounds(#WinApp, 800, 600, #PB_Ignore,#PB_Ignore) 
  SetWindowColor(#WinApp, #Black)
  
  ExplorerListGadget(#Explorer,10,10,780*XDPI,580*YDPI,GetHomeDirectory(),#PB_Explorer_NoDriveRequester|#PB_Explorer_NoSort)  
  
  BindEvent(#PB_Event_SizeWindow, @sizeWindow())
  
  AddWindowTimer(#WinApp, Minuteur, 3000) ;vérification toutes les 3 secondes, peut être à faire toutes les 10 ou 30 secondes, à voir
  
  Repeat
    Event = WaitWindowEvent() 
    
    If Event = #PB_Event_Timer And EventTimer() = Minuteur
       CurrentDPI()
    EndIf
      
  Until Event = #PB_Event_CloseWindow
  End 
EndIf
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Question de DPI - A l'aide SVP

Message par cage »

Bonjour,

@ Jacobus, merci pour ton code qui rejoint dans l'idée ce que j'avais essayé de mettre en place dans la boucle d'événements.
Malheureusement, ça ne fonctionne pas, d'où mon appel a l'aide.
La valeur DPI est bien trouvée au lancement de l'application, mais pas par la suite si on change le facteur d'échelle.
C'est bien pour ça que j'indiquais
Le problème est que toutes les commandes DesktopResolutionY(), DesktopScaledX(), DesktopScaledY(), DesktopUnscaledX(), DesktopUnscaledY() ne fonctionnent qu'au lancement de l'application.
Pour essayer de pallier ce problème, j'ai créé un petit exécutable qui retourne toujours la bonne valeur DPI
Code GetDPI.pb a compiler en GetDPI.exe en mode Console et DPI coché

Code : Tout sélectionner

EnableExplicit

Procedure GetDPI()
  Protected HDC = GetDC_(0)
  Protected DPI = GetDeviceCaps_(HDC, #LOGPIXELSX)
  Protected SCALE = (DPI*100/96)
  Debug SCALE
  ProcedureReturn SCALE
EndProcedure
Define SCALE = GetDPI() : Debug SCALE
If ProgramParameter()
  OpenConsole("",#PB_Unicode)
  Print(Str(SCALE))
  CloseConsole()
EndIf
End SCALE
Utilisation en ligne de commande dans une 'Invite de commandes':

Code : Tout sélectionner

C:\Users\admin>GetDPI.exe

C:\Users\admin>echo %errorlevel%
100

C:\Users\admin>
C:\Users\admin>GetDPI.exe -
100
C:\Users\admin>
Utilisation de GetDPI.exe dans du code PB:

Code : Tout sélectionner

Global DPI.d, SCALE.d

Procedure.d GetDPI()
  Debug "GetDPI()"
  Protected runprg
  runprg = RunProgram("GetDPI.exe","","",#PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
  If runprg
    While ProgramRunning(runprg)
    Wend
    DPI = ProgramExitCode(runprg)
    CloseProgram(runprg)
    ProcedureReturn DPI/100
  Else
    ProcedureReturn 1
  EndIf
EndProcedure

SCALE = GetDPI()
Debug "SCALE = " + SCALE
Debug "DPI = " + DPI
L'inconvénient de GetDPI.exe est qu'on ne peut pas l'exécuter dans une boucle d'événements.

Alors, pour pallier cet inconvénient, j'ai créé une DLL GetDPI.dll a compiler en mode 'Shared DLL' et DPI coché

Code de la DLL:

Code : Tout sélectionner

Global DPI.d

ProcedureDLL GetDPI()
 HDC = GetDC_(0)
 DPI = GetDeviceCaps_(HDC, #LOGPIXELSX)
 DPI = (DPI*100/96)
 ProcedureReturn DPI
EndProcedure
Utilisation de la DLL :

Code : Tout sélectionner

#LibDPI = 0

Global DPI.d

If OpenLibrary(#LibDPI, "GetDPI.dll")
  DPI = CallFunction(#LibDPI, "GetDPI")
  CloseLibrary(#LibDPI)
Else
  Debug "Impossible d'ouvrir la librairie."
  DPI = 100
EndIf

Debug "DPI = " + DPI
Avantage de l'utilisation d'une DLL, il peut en être fait un usage intensif dans une boucle d'événements.
Malheureusement, elle ne permet pas de détecter les changements de facteur d'échelle.
Le problème est le même, la valeur DPI est bien trouvée au lancement de l'application, mais pas par la suite.

Conclusion, seule l'utilisation de GetDPI.exe permet a coup sûr de trouver le facteur d'échelle.

Il-y-a t'il une erreur dans mon code qui pourrait expliquer ça, ou alors est-ce juste une mauvaise compréhension de ma part.
Je ne m'attendais pas a un tel soucis avec l'utilisation d'une DLL qui ne retourne pas la vrai valeur DPI

Si une bonne âme passe par ici, merci.

cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Question de DPI - A l'aide SVP

Message par Ar-S »

Salut,
J'avoue que le changement de dpi par un utilisateur est surement peu fréquent, surtout pendant qu'un soft tourne. Dans ton cas tu as l'air cependant d'y tenir. Si à la volée ça ne fonctionne pas, peut-être peux tu, à défaut de relancer la détection dpi, détecter le fait qu'il y ait eu un changement de dpi et alors afficher un popup pour simplement relancer le programme ?
~~~~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
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Question de DPI - A l'aide SVP

Message par cage »

Bonjour,

Merci Ar-S pour ta réponse.

Une personne qui m'est très proche utilise une valeur d'échelle de 175% sur un portable 17 pouces par le fait d'une très mauvaise vue.

Problème lors de l'utilisation de son PC, quand elle lance certaines applications, certaines actions ne sont pas accessibles car certains boutons sont hors écran (en bas de l'application) ou certaines commandes sont disposées toujours hors écran (en bas de l'application).

La solution pour elle est de changer la valeur d'échelle (150% voire 125% dans certains cas).

Ce que je voudrais, c'est que les quelques applications que j'ai développé et qu'elle utilise aient toujours la même taille sur l'écran en s'actualisant en fonction de la valeur d'échelle qu'elle utilise a un instant donné.

Faire en sorte que l'application ait la même taille en fonction du DPI, je sais faire en partie, ce que je ne sais pas faire, c'est détecter le changement d'échelle.

Par exemple, l'application MyAPP.exe détecte 175% au lancement, puis la personne passe a 150%, comment faire pour que MyApp.exe détecte ce changement pour me permettre d'actualiser son affichage pour que celui-ci soit toujours le même.

Toutes les commandes PB retournent toujours la valeur initiale de l'échelle trouvée au lancement de l'application.

cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Question de DPI - A l'aide SVP

Message par SPH »

Changer de DPI en pleine utilisation d'un programme est plutôt rare, non ?

Mais si ca se produit, la réponse m'intéresserait :idea:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Question de DPI - A l'aide SVP

Message par cage »

Plusieurs cas réels d'utilisation de programmes dont le bouton pour quitter l'application est en bas mais non visible avec une valeur d'échelle a 175% ou 150%

A part passer par le Gestionnaire des tâches et tuer le process, la meilleure méthode est de baisser la valeur d'échelle.

Ensuite, chaque personne utilise la valeur d'échelle qui lui convient en fonction de son age et de sa vision.

Ça m'arrivera peut-être un jour.

cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Question de DPI - A l'aide SVP

Message par Ar-S »

Le problème est que toutes les commandes DesktopResolutionY(), DesktopScaledX(), DesktopScaledY(), DesktopUnscaledX(), DesktopUnscaledY() ne fonctionnent qu'au lancement de l'application.
Lire ça me fait dire que c'est de l'ordre du bug. Surtout si tu as essayé même avec un timer.
As tu soumis ceci sur le fofo anglais ?
~~~~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
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Question de DPI - A l'aide SVP

Message par Marc56 »

Plusieurs cas réels d'utilisation de programmes dont le bouton pour quitter l'application est en bas mais non visible avec une valeur d'échelle a 175% ou 150%

A part passer par le Gestionnaire des tâches et tuer le process, la meilleure méthode est de baisser la valeur d'échelle.
La bonne méthode c'est surtout de normaliser les programmes (présentation, raccourcis) quand on veut s'adresser à un grand public.
Ex: Alt + F4 = Quitter
Utiliser de préférence les raccourcis classiques pour garder le contrôle même si la fenêtre est hors d'atteinte ou si la souris se bloque.
Tous les développeurs devraient connaitre le guide de conception des GUI ainsi que maintenant le RGAA (même si ce dernier est obligatoire pour les sites web administratifs, il y a des choses qui s'appliquent bien aux programmes)

PS. La gestion des DPI pour les interfaces est une galère dans tous les langages.
:wink:
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Question de DPI - A l'aide SVP

Message par venom »

Bonjour à tous.

Comme purebasic ne le fait pas nativement (détection changement de dpi) tu devrais voir côté Api windows

WM_DPICHANGED

J'imagine que tu t'es déjà renseigné :roll: :)







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Question de DPI - A l'aide SVP

Message par cage »

Bonsoir,

@ venom, oui tu imagines bien.

#WM_DPICHANGED = 736 ; $2E0

Ce message est retourné quand l'application est déplacée d'un écran a un autre dont le DPI n'est pas le même.

Dans mon cas, il n'y a qu'un seul écran, c'est celui du PC portable.

Je me demande si ce que je cherche a faire est possible, a savoir détecter dans une application active le changement de DPI

Avec une application externe comme GetDPI.exe (du PB compilé), il est possible de connaitre la valeur d'échelle en cours.

Avec SetDPI.exe, je peux modifier la valeur d'échelle sans passer par les paramètres.

cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Question de DPI - A l'aide SVP

Message par cage »

Un exemple parmi d'autres de mes tentatives de trouver le facteur d'échelle et/ou le DPI ou PPP
Lancez l'application, elle affiche le facteur d'échelle en cours.
Changez la valeur d'échelle en passant par exemple de 100% a 125%
Cliquez sur le bouton [ Get DPI ] et pas de miracle, le facteur d'échelle ne change pas.
Pour les plus curieux d'entre vous, je vous laisse méditer.
Code a tester:

Code : Tout sélectionner

EnableExplicit

#WIN=0
#BTN=0
#SBAR=1

Global DpiSystem.s, DpiWindow.s, hWindow

ImportC "User32.lib"
  GetDpiForSystem()
  GetDpiForWindow(WindowID)
EndImport

Procedure GetDPI()
  Debug "Nouvelle requête GetDPI()"
  Debug ""
  DpiSystem = Str(GetDpiForSystem() * 100 / 96)+"%"
  DpiWindow = Str(GetDpiForWindow(hWindow) * 100 / 96)+"%"
  Debug "DpiSystem   : " + DpiSystem + "  soit ppp = " + GetDpiForSystem()
  Debug "DpiWindow : " + DpiWindow + "  soit ppp = " + GetDpiForWindow(hWindow)
  Debug ""
  StatusBarText(#SBAR, 0, "DpiSystem : " + DpiSystem, #PB_StatusBar_Center)
  StatusBarText(#SBAR, 1, "DpiWindow : " + DpiWindow, #PB_StatusBar_Center)
EndProcedure

If OpenWindow(#WIN, 0, 0, 300, 60, "GetDPI", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  hWindow = WindowID(#WIN)
  ButtonGadget(#BTN, 5, 5, 290, 25, "Get DPI")
  CreateStatusBar(#SBAR, hWindow)
  AddStatusBarField(#PB_Ignore)
  AddStatusBarField(#PB_Ignore)
  GetDPI()
  Define Event, indexGadget
  Repeat
    Event = WaitWindowEvent(50)
    Select Event
      Case #PB_Event_Gadget
        indexGadget = EventGadget()
        Select indexGadget
          Case #BTN
            GetDPI()
        EndSelect
      Case #PB_Event_CloseWindow : Break
    EndSelect
  ForEver
EndIf
End
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Question de DPI - A l'aide SVP

Message par MLD »

Bonjour cage
Le DPI a la sauce Windows est vraiment une galère. (J'ai payer pour savoir)
Ce que tu demande est un peu tordu, mais a mon avis pas insoluble.
Il y a certainement dans les API Windows une fonction qui indique en permanence la valeur d'échelle de Windows lui même.
Ton logiciel doit récupéré cette valeur,ensuite tu redessine la ou les fenêtres, mais ça tu sais faire.
Je n'est pas l'API utile sous la main, et en ce moment pas trop le temps, mais lance un appel sur le fofo US. Tu devrais avoir une réponse je pense.
Bon courage :wink:
A +
Répondre