Question de DPI - A l'aide SVP
Re: Question de DPI - A l'aide SVP
@ cage
Regarde du coté de l'API GetWindowRect
A+
Regarde du coté de l'API GetWindowRect
A+
Re: Question de DPI - A l'aide SVP
Bonsoir,
@ Ar-S
Je ne pense pas que ce soit un bug, je pense plutôt qu'une application lorsqu'elle est lancée possède une copie de l'environnement a partir duquel elle est lancée. Elle hérite donc de la valeur du DPI dont la valeur ne peut pas être synchronisée avec la valeur du DPI de l'environnement appelant.
D'où mes tentatives pour trouver une solution pour lire la valeur DPI système (valeur globale) a partir de mes applications.
@ Marc56
Le problème n'est pas tant de fermer l'application mais de pouvoir accéder aux commandes qui sont hors écran.
@ MLD
Merci a tous.
cage
@ Ar-S
Je préfère rester sur le forum français pour le faire vivre un peu.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 ?
Je ne pense pas que ce soit un bug, je pense plutôt qu'une application lorsqu'elle est lancée possède une copie de l'environnement a partir duquel elle est lancée. Elle hérite donc de la valeur du DPI dont la valeur ne peut pas être synchronisée avec la valeur du DPI de l'environnement appelant.
D'où mes tentatives pour trouver une solution pour lire la valeur DPI système (valeur globale) a partir de mes applications.
@ Marc56
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
Le problème n'est pas tant de fermer l'application mais de pouvoir accéder aux commandes qui sont hors écran.
@ MLD
Même réponse que pour Ar-S, je préfère rester sur le forum français pour le faire vivre un peu. (Pour l'instant)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.
Je vais regarder cette commande pour voir si ça pourrait être la solution.Regarde du coté de l'API GetWindowRect
Merci a tous.
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
■ 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
Re: Question de DPI - A l'aide SVP
Bonsoir,
Un bout de code qui permet d'activer le DPI dans une application sans passer par les options de PB
Un bout de code qui permet d'activer le DPI dans une application sans passer par les options de PB
Code : Tout sélectionner
EnableExplicit
CompilerSelect #PB_Compiler_DPIAware
CompilerCase #True : Debug "The DPI awareness for the app is set by option!"
CompilerCase #False : Debug "The DPI awareness for the app is not set by option!"
CompilerEndSelect
Enumeration Windows
#Window
EndEnumeration
Enumeration
#Lib
EndEnumeration
#DPI_AWARENESS_INVALID = -1
#DPI_AWARENESS_UNAWARE = 0
#DPI_AWARENESS_SYSTEM_AWARE = 1
#DPI_AWARENESS_PER_MONITOR_AWARE = 2
Global Result
If OpenWindow(#Window,0,0,300,200,"Window")
; Tester avec ou sans l'option DPI aware
; Compiler Options : [x] Enable DPI aware executable (Windows and macOS)
; Si Enable DPI n'est pas activé dans les options,
; il est activé pour l'application en cours via la commande suivante:
If OpenLibrary(#Lib, "Shcore.dll")
If GetFunction(#Lib, "SetProcessDpiAwareness")
Result = CallFunction(#Lib, "SetProcessDpiAwareness",#DPI_AWARENESS_SYSTEM_AWARE)
Select Result
Case #S_OK : Debug #LF$+"The DPI awareness for the app was set successfully by the application!"
Case #E_INVALIDARG : Debug #LF$+"The value passed in is not valid!"
Case #E_ACCESSDENIED : Debug #LF$+"The DPI awareness is already set, either by calling this API previously or through the application (.exe) manifest!"
Default : Debug #LF$+"Erreur inconnue!"
EndSelect
Else
Debug #LF$+"La fonction n'existe pas!"
EndIf
CloseLibrary(#Lib)
Else
Debug #LF$+"Une erreur est survenue lors de l'ouverture de la librairie!"
EndIf
If OpenLibrary(#Lib, "User32.dll")
If GetFunction(#Lib, "GetDpiForSystem")
Debug #LF$+"GetDpiForSystem = " + CallFunction(#Lib, "GetDpiForSystem")
EndIf
If GetFunction(#Lib, "GetDpiForWindow")
Debug #LF$+"GetDpiForWindow = " + CallFunction(#Lib, "GetDpiForWindow",WindowID(#Window))
EndIf
CloseLibrary(#Lib)
Else
Debug #LF$+"Une erreur est survenue lors de l'ouverture de la librairie!"
EndIf
EndIf
;Tools : http://www.alternate-tools.com/pages/c_dllanalyzer.php
■ 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
■ 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
Re: Question de DPI - A l'aide SVP
La fonction 'GetWindowRect' renvoie uniquement le positionnement et la taille de la fenêtre de l'application.
Exemple:
Code : Tout sélectionner
EnableExplicit
Enumeration Windows
#Window
EndEnumeration
Global hWnd
Global DISPLAY.RECT
If OpenWindow(#Window,100,50,300,200,"Window")
hWnd = WindowID(#Window)
If GetWindowRect_(hWnd, @DISPLAY)
With DISPLAY
Debug "Top : " + \top
Debug "Bottom : " + \bottom
Debug "Left : " + \left
Debug "Right : " + \right
EndWith
EndIf
EndIf
■ 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
■ 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
Re: Question de DPI - A l'aide SVP
Bonjour cage
Si j'ai bien compris ton "client" ne peu changer le DPI que si la fenêtre est réduite dans la barre de tache.
Dans ce cas ce que je tenterais pour moi.
Dans la boucle principale je surveille que la fenêtre a été réduite avec l'API IsIconic. Si le résultat passe de 1 a 0. Je lance dans une procédure une fenêtre bidon invisible ou je récupère le DPI au lancement. Ensuite je close la fenêtre bidon et je redessine en la rendant invisible le temps du dessin la fenêtre principale
Surtout ne pas cocher la case DPI de PB. (qui sème le souque)
J'utilise dans tout mes logiciels le système de la fenêtre bidon pour récupérer DPI et autres éléments utile pour dessiner fenêtres et gadgets sur n'importe quel écrans. (regarde sur le forum par exemple le programme encore une loi! celle de Mr Ohm dans application)
Si cela peut te donner une piste je serais ravis
A+
Si j'ai bien compris ton "client" ne peu changer le DPI que si la fenêtre est réduite dans la barre de tache.
Dans ce cas ce que je tenterais pour moi.
Dans la boucle principale je surveille que la fenêtre a été réduite avec l'API IsIconic. Si le résultat passe de 1 a 0. Je lance dans une procédure une fenêtre bidon invisible ou je récupère le DPI au lancement. Ensuite je close la fenêtre bidon et je redessine en la rendant invisible le temps du dessin la fenêtre principale
Surtout ne pas cocher la case DPI de PB. (qui sème le souque)
J'utilise dans tout mes logiciels le système de la fenêtre bidon pour récupérer DPI et autres éléments utile pour dessiner fenêtres et gadgets sur n'importe quel écrans. (regarde sur le forum par exemple le programme encore une loi! celle de Mr Ohm dans application)
Si cela peut te donner une piste je serais ravis
A+
Re: Question de DPI - A l'aide SVP
Bonjour,
Merci MLD,
Je vais regarder ta solution de plus prêt pour voir si ça fonctionne comme je le souhaite.
Cette histoire de DPI m'aura au moins permis d'approfondir les arcanes de PB, très intéressant pour s'améliorer et j'en ai besoin.
Je suis entrain d'explorer la piste 'Base De Registre' en lisant une des 2 clés suivantes
Si j'arrive a quelque chose qui fonctionne (au moins pour mon besoin), je posterai le code.
cage
Merci MLD,
Je vais regarder ta solution de plus prêt pour voir si ça fonctionne comme je le souhaite.
Cette histoire de DPI m'aura au moins permis d'approfondir les arcanes de PB, très intéressant pour s'améliorer et j'en ai besoin.
Je suis entrain d'explorer la piste 'Base De Registre' en lisant une des 2 clés suivantes
Code : Tout sélectionner
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers\ScaleFactors\
HKEY_CURRENT_USER\Control Panel\Desktop\PerMonitorSettings\ ; Celle ci me parait intéressante
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
■ 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
Re: Question de DPI - A l'aide SVP
Bonsoir,
La solution base de registre marche comme espérée.
Je posterai un code le plus tôt possible.
cage
La solution base de registre marche comme espérée.
Je posterai un code le plus tôt possible.
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
■ 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
Re: Question de DPI - A l'aide SVP
Bonjour cage
Super
j'ai hâte de voir ton code, cela m’intéresse beaucoup. 
Super


Re: Question de DPI - A l'aide SVP
Bonsoir,
Voici un exemple de l'utilisation de la base de registre pour connaitre la vraie valeur DPI a un instant T dans une application PB

Le changement rapide du facteur d'échelle se fait a partir de l'application grace a un utilitaire SetDPI.exe trouvé sur github
https://github.com/imniko/SetDPI
L'interface graphique de l'application reste la même quelque soit le DPI utilisé.
Seule la barre de titre et la barre de status changent de hauteur.
Si vous avez une idée de comment faire pour que la hauteur des 2 barres ne change pas quand on change le DPI, merci de partager.
J'ai quand même un problème avec la taille de la police utilisée, l'affichage est loin d'être parfait.
Le code non plus n'est pas parfait, mais il fonctionne parfaitement.
Si vous avez des idées pour parfaire le code, n'hésitez pas, toute critique sera la bienvenue.
cage
Voici un exemple de l'utilisation de la base de registre pour connaitre la vraie valeur DPI a un instant T dans une application PB
Code : Tout sélectionner
EnableExplicit
CompilerSelect #PB_Compiler_DPIAware
CompilerCase #True : Debug "The DPI awareness for the app is set by option!"
CompilerCase #False : Debug "The DPI awareness for the app is not set by option!"
CompilerEndSelect
Enumeration Windows
#WIN
EndEnumeration
Enumeration Gadgets
#BTN0
#BTN1
#BTN2
#BTN3
#BTN4
#BTN5
#BTN6
#SBAR
EndEnumeration
Enumeration Fonts
#FontDefault
EndEnumeration
#DPI_AWARENESS_INVALID = -1
#DPI_AWARENESS_UNAWARE = 0
#DPI_AWARENESS_SYSTEM_AWARE = 1
#DPI_AWARENESS_PER_MONITOR_AWARE = 2
Define SHCORE, RESULT
SHCORE = OpenLibrary(#PB_Any, "Shcore.dll")
If SHCORE
If GetFunction(SHCORE, "SetProcessDpiAwareness")
;CallFunction(SHCORE, "SetProcessDpiAwareness",#DPI_AWARENESS_PER_MONITOR_AWARE)
RESULT = CallFunction(SHCORE, "SetProcessDpiAwareness",#DPI_AWARENESS_SYSTEM_AWARE)
Select RESULT
Case #S_OK : Debug "The DPI awareness for the app was set successfully!"
Case #E_INVALIDARG : Debug "The value passed in is not valid!"
Case #E_ACCESSDENIED : Debug "The DPI awareness is already set, either by calling this API previously or through the application (.exe) manifest!"
Default : Debug "Erreur inconnue!"
EndSelect
Else
Debug "La fonction n'existe pas!"
EndIf
CloseLibrary(SHCORE)
Else
Debug "Une erreur est survenue lors de l'ouverture de la librairie!"
EndIf
;;; Noms des clés racines par ordre d'affichage dans RegEdit
;;;
;;; CLÉS RACINES - [ HKCR | HKCU | HKLM | HKU | HKCC ]
;;;
#HKCR=#HKEY_CLASSES_ROOT
#HKCC=#HKEY_CURRENT_CONFIG
#HKCU=#HKEY_CURRENT_USER
#HKLM=#HKEY_LOCAL_MACHINE
#HKU =#HKEY_USERS
Structure Key
Monitor.s
DpiValue.i
EndStructure
Global NewMap Monitors.Key()
Structure Dpi
Scale.s
Value.d
EndStructure
Global NewMap DPI.Dpi()
Define Index, Value
For Index = 0 To 16
Value = 100+Index*25
With DPI(Str(Index))
\Scale = Str(Value)+"%"
\Value = Value/100
EndWith
Next
ForEach DPI()
Debug DPI()\Scale+" "+DPI()\Value
Next
Global DpiSystem.s, DpiWindow.s, hWindow
ImportC "User32.lib"
GetDpiForSystem()
GetDpiForWindow(WindowID)
EndImport
Define OldDPI.d, NewDPI.d
Global DPI.d, LibDPI$, RegDPI, RegDPI$
Procedure.a RegEnumKey(rootKey, subKey$)
; https://www.purebasic.fr/french/viewtopic.php?t=1223
Protected Enum, hKey, iSubkey
Protected lpcchName, lpszName$, lpftLastWrite
Protected nbKeys=0
If RegOpenKeyEx_(rootKey, subKey$ + "\", 0, #KEY_ENUMERATE_SUB_KEYS, @hKey) = #ERROR_SUCCESS
; iSubkey = 0 ; compteur utilisé par RegEnumKeyEx pour énumérer les SubKey
; incémenté de 1 à chaque tour de boucle
lpcchName = 256 ; variable indiquant la taille max de la chaine
lpszName$ = Space(lpcchName) ; initialisation de la chaine qui récupère la SubKey
Enum = RegEnumKeyEx_(hKey, iSubkey, @lpszName$, @lpcchName, 0, 0, 0, @lpftLastWrite)
While Enum <> #ERROR_NO_MORE_ITEMS
iSubkey + 1 ; on incrémente le compteur d'énumération
Protected B$= subKey$ + "\" + lpszName$
;Debug B$
nbKeys + 1
;ReDim Monitors(nbKeys)
;Monitors(nbKeys) = lpszName$
Monitors(Str(nbKeys))\Monitor = lpszName$
Monitors(Str(nbKeys))\DpiValue = -1
RegEnumKey(rootKey, B$) ; appel récursif de la procédure)
Enum = RegEnumKeyEx_(hKey, iSubkey, lpszName$, @lpcchName, 0, 0, 0, @lpftLastWrite)
Wend
RegCloseKey_(hKey)
;If nbKeys = 1
; ProcedureReturn lpszName$
;Else
; ProcedureReturn ""
;EndIf
ProcedureReturn nbKeys
EndIf
EndProcedure
Procedure.l RegReadDWord(rootKey, subKey$, key$)
Protected value=-1, datasize.l=4 ; 4 bytes = 32 bits (long).
Protected hKey
If RegOpenKeyEx_(rootKey,subKey$,0,#KEY_READ,@hKey)=#ERROR_SUCCESS
If RegQueryValueEx_(hKey,key$,0,0,@value,@datasize)<>#ERROR_SUCCESS
value=-1
EndIf
RegCloseKey_(hKey)
EndIf
ProcedureReturn value
EndProcedure
Procedure.a GetRegDPI()
Protected index, nbKeys, value, key$
;
;Protected rootKey = #HKLM
;Protected subKey$ = "System\CurrentControlSet\Control\GraphicsDrivers\ScaleFactors"
;
Protected rootKey = #HKCU
Protected subKey$ = "Control Panel\Desktop\PerMonitorSettings"
Protected hKey
If RegOpenKeyEx_(rootKey, subKey$,0,#KEY_READ,@hKey) = #ERROR_SUCCESS
nbKeys = RegEnumKey(rootKey, subKey$)
EndIf
If nbKeys
For index = 1 To nbKeys
key$ = subKey$ + "\" + Monitors(Str(index))\Monitor
value = RegReadDWord(rootKey,Key$,"DpiValue")
value = value & $ffff
Monitors(Str(index))\DpiValue = value
Next
RegDPI = Monitors("1")\DpiValue
DPI = DPI(Str(RegDPI))\Value
RegDPI$ = DPI(Str(RegDPI))\Scale
ProcedureReturn RegDPI
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.s GetLibDPI()
Debug #LF$+"Nouvelle requête GetLibDPI()"+#FF$
;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, "Lib DPI : " + DpiSystem, #PB_StatusBar_Center)
StatusBarText(#SBAR, 1, "Reg DPI : " + RegDPI$ , #PB_StatusBar_Center)
LibDPI$ = DpiSystem
ProcedureReturn LibDPI$
EndProcedure
Global W=300, H=200
Procedure CreateGUI()
SetGadgetFont(#PB_Default , #PB_Default)
Protected FontSize.d = Round(10/DPI, #PB_Round_Up) : Debug "FontSize = " + FontSize
If DPI > 1
If LoadFont(#FontDefault, "Segoe UI", FontSize,#PB_Font_HighQuality)
;If LoadFont(#FontDefault, "Consolas", FontSize,#PB_Font_HighQuality)
SetGadgetFont(#PB_Default , FontID(#FontDefault))
EndIf
EndIf
ResizeWindow(#WIN, #PB_Ignore, #PB_Ignore, W/DPI, H/DPI)
ButtonGadget(#BTN0, 15/DPI, 15/DPI, 270/DPI, 25/DPI, "Get Lib DPI")
ButtonGadget(#BTN1, 15/DPI, 55/DPI, 270/DPI, 25/DPI, "Get Reg DPI")
ButtonGadget(#BTN2, 15/DPI, 95/DPI, 50/DPI, 25/DPI, "DPI 100")
ButtonGadget(#BTN3, 70/DPI, 95/DPI, 50/DPI, 25/DPI, "DPI 125")
ButtonGadget(#BTN4, 125/DPI, 95/DPI, 50/DPI, 25/DPI, "DPI 150")
ButtonGadget(#BTN5, 180/DPI, 95/DPI, 50/DPI, 25/DPI, "DPI 175")
ButtonGadget(#BTN6, 235/DPI, 95/DPI, 50/DPI, 25/DPI, "DPI 200")
EndProcedure
OldDPI = GetRegDPI()
If OpenWindow(#WIN, 0, 0, W/DPI, H/DPI, "GetDPI", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
hWindow = WindowID(#WIN)
SetWindowColor(#WIN, #Gray)
SmartWindowRefresh(#WIN, #True)
CreateGUI()
CreateStatusBar(#SBAR, hWindow)
AddStatusBarField(#PB_Ignore)
AddStatusBarField(#PB_Ignore)
Debug "LibDPI = " + GetLibDPI()+#LF$
Define Event, indexGadget
Repeat
Event = WaitWindowEvent(50)
NewDPI = GetRegDPI()
If NewDPI <> OldDPI
CreateGUI()
OldDPI = NewDPI
StatusBarText(#SBAR, 1, "Reg DPI : " + RegDPI$ , #PB_StatusBar_Center)
EndIf
Select Event
Case #PB_Event_Gadget
indexGadget = EventGadget()
Select indexGadget
Case #BTN0 : Debug "LibDPI = " + GetLibDPI()+#LF$
Case #BTN1 : Debug "RegDPI = " + GetRegDPI()+" soit RegDPI = " + RegDPI$+#LF$
Case #BTN2 : RunProgram("SetDPI.exe", "100", "") : CreateGUI()
Case #BTN3 : RunProgram("SetDPI.exe", "125", "") : CreateGUI()
Case #BTN4 : RunProgram("SetDPI.exe", "150", "") : CreateGUI()
Case #BTN5 : RunProgram("SetDPI.exe", "175", "") : CreateGUI()
Case #BTN6 : RunProgram("SetDPI.exe", "200", "") : CreateGUI()
EndSelect
Case #PB_Event_CloseWindow : Break
EndSelect
ForEver
EndIf
RunProgram("SetDPI.exe", "100", "")
End
;https://github.com/imniko/SetDPI
;https://github.com/imniko/SetDPI/releases/

Le changement rapide du facteur d'échelle se fait a partir de l'application grace a un utilitaire SetDPI.exe trouvé sur github
https://github.com/imniko/SetDPI
L'interface graphique de l'application reste la même quelque soit le DPI utilisé.
Seule la barre de titre et la barre de status changent de hauteur.
Si vous avez une idée de comment faire pour que la hauteur des 2 barres ne change pas quand on change le DPI, merci de partager.
J'ai quand même un problème avec la taille de la police utilisée, l'affichage est loin d'être parfait.
Le code non plus n'est pas parfait, mais il fonctionne parfaitement.
Si vous avez des idées pour parfaire le code, n'hésitez pas, toute critique sera la bienvenue.
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
■ 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
Re: Question de DPI - A l'aide SVP
Bonjour cage
Une autre approche, mais pas parfaite non plus. Je ne maitrise pas la hauteur de la barre de titre.
1Tu lance le logiciel
2 Tu réduit la fenêtre
3 Tu change le DPI a 150% par expl
4 Tu met la fenêtre en visible.
Ce système d'agrandissement Sauce Microsoft est un peu débile. Le système en fonction des définition d'écran devrais s'ajusté automatiquement pour être lisible, et non pour que l'on se crève les yeux avec des définitions de plus en plus hautes. Bientôt nous ne lirons plus rien sans une loupe. Mais nous aurons une super définition.
A plus Bon WE
Une autre approche, mais pas parfaite non plus. Je ne maitrise pas la hauteur de la barre de titre.
1Tu lance le logiciel
2 Tu réduit la fenêtre
3 Tu change le DPI a 150% par expl
4 Tu met la fenêtre en visible.
Ce système d'agrandissement Sauce Microsoft est un peu débile. Le système en fonction des définition d'écran devrais s'ajusté automatiquement pour être lisible, et non pour que l'on se crève les yeux avec des définitions de plus en plus hautes. Bientôt nous ne lirons plus rien sans une loupe. Mais nous aurons une super définition.
Code : Tout sélectionner
;$$$$$$$ Attention ne pas cocher la case DPI de PB $$$$$$$$$$$$$$$$$$
;¤¤¤¤ Assignation des gadgets ¤¤¤¤
#Ma_fen = 1
#Ldef = 1920:#Hdef = 1080
Global definecrht.d = GetSystemMetrics_(#SM_CYSCREEN):Global definecrlarg.d = GetSystemMetrics_(#SM_CXSCREEN)
Global typH.b,L.d
Global dp.b = 0
Declare fen()
;¤¤¤¤¤¤¤¤
Procedure verifbar()
If IsIconic_(WindowID(1)) <> 0 :dp =1:EndIf
If dp = 1 And IsIconic_(WindowID(1))= 0 : fen() :EndIf
EndProcedure
Procedure dfw()
Global definecrht.d = GetSystemMetrics_(#SM_CYSCREEN):Global definecrlarg.d = GetSystemMetrics_(#SM_CXSCREEN)
EndProcedure
Procedure Lw(Dl.d)
L.d = Dl * (definecrlarg /#Ldef)
ProcedureReturn L.d
EndProcedure
Procedure Hw(Dh.d)
H.d = Dh * (definecrht /#Hdef)
ProcedureReturn H.d
EndProcedure
Procedure Ywp(y.d)
ProcedureReturn y.d *(definecrht.d /#Hdef)
EndProcedure
Procedure XWp(lp.d)
ProcedureReturn lp.d * (definecrlarg /#Ldef)
EndProcedure
Procedure fen()
If dp = 1:dp = 0:EndIf
dfw()
OpenWindow(1,Xwp(150),Ywp(50),Lw(660),Hw(250),"Ma Fenêtre",#PB_Window_MinimizeGadget|#NUL|#NUL|#NUL)
;Vos gadgets ici
;
;
EndProcedure
fen()
Repeat
Event = WaitWindowEvent()
verifbar()
Until Event = #PB_Event_CloseWindow
Endcode]
A plus Bon WE
- falsam
- Messages : 7317
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Question de DPI - A l'aide SVP
Réponse très tardive
. l'évènement #PB_Event_Repaint devrait pouvoir détecter le changement de DPI d'une application active.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- falsam
- Messages : 7317
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Question de DPI - A l'aide SVP
Avec ce code et la gestion des DPI activé dans les options de compilation et avec un affichage à 125%, le CanvasGadget n'est pas coloré entierement.
■ Alors comment faire ? j'ai fait un test avec l'évènement #PB_Event_Repaint en ajoutant dans le code deux autres canvas et un peu de texte pour voir comment l'affichage va réagir en fonction de la mise à l'échelle 100% 125% et 150% tout en gardant l'exécutable actif.
A prioris je pense que cela fonctionne sans API ou plugin. Voici le code à tester. d'avance merci pour vos retour d'expériences.
Code : Tout sélectionner
EnableExplicit
CompilerSelect #PB_Compiler_DPIAware
CompilerCase #True : Debug "La gestion des DPI est activé dans les options de compilation."
CompilerCase #False : Debug "La gestion des DPI N'EST PAS ACTIVE dans les options de compilation."
CompilerEndSelect
Enumeration window
#mf
EndEnumeration
Enumeration gadget
#mfCanvas
EndEnumeration
;Sommaire
Declare Start()
Declare Draw()
Declare Exit()
Start()
Procedure Start()
OpenWindow(#mf, 0, 0, 520, 520, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
CanvasGadget(#mfCanvas, 10, 10, 500, 500)
Draw()
; Déclencheur
BindEvent(#PB_Event_CloseWindow, @Exit())
; Loop
Repeat : WaitWindowEvent() : ForEver
EndProcedure
Procedure Draw()
StartDrawing(CanvasOutput(#mfCanvas))
; Fond du canvas
Box(0, 0, 500, 500, RGB(169, 169, 169))
StopDrawing()
EndProcedure
Procedure Exit()
End
EndProcedure
■ Alors comment faire ? j'ai fait un test avec l'évènement #PB_Event_Repaint en ajoutant dans le code deux autres canvas et un peu de texte pour voir comment l'affichage va réagir en fonction de la mise à l'échelle 100% 125% et 150% tout en gardant l'exécutable actif.
A prioris je pense que cela fonctionne sans API ou plugin. Voici le code à tester. d'avance merci pour vos retour d'expériences.
Code : Tout sélectionner
EnableExplicit
CompilerSelect #PB_Compiler_DPIAware
CompilerCase #True : Debug "La gestion des DPI est activé dans les options de compilation."
CompilerCase #False : Debug "La gestion des DPI N'EST PAS activé dans les options de compilation."
CompilerEndSelect
Enumeration window
#mf
EndEnumeration
Enumeration gadget
#mfCanvas0
#mfCanvas1
#mfCanvas2
EndEnumeration
Enumeration misc
#font
EndEnumeration
;Sommaire
Declare Start()
Declare Draw()
Declare Exit()
Start()
Procedure Start()
LoadFont(#font, "Arial", 15)
OpenWindow(#mf, 0, 0, 520, 520, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
CanvasGadget(#mfCanvas0, 10, 10, 500, 400)
CanvasGadget(#mfCanvas1, 10, 413, 248, 100)
CanvasGadget(#mfCanvas2, 262, 413, 248, 100)
Draw()
; Déclencheur
BindEvent(#PB_Event_CloseWindow, @Exit())
BindEvent(#PB_Event_Repaint, @Draw())
; Loop
Repeat : WaitWindowEvent() : ForEver
EndProcedure
Procedure Draw()
Protected DPI.i = DesktopScaledX(100)
Protected Coef.f = DPI/100
Debug "Evenement #PB_Event_Repaint détecté. DPI = " + Str(DPI)
StartDrawing(CanvasOutput(#mfCanvas0))
Box(0, 0, 500*Coef, 400*Coef, RGB(169, 169, 169))
StopDrawing()
StartDrawing(CanvasOutput(#mfCanvas1))
Box(0, 0, 248*Coef, 100*Coef, RGB(169, 169, 169))
DrawingFont(FontID(#font))
DrawText(0, 0, "[--------- PureBasic ----------]", RGB(105, 105, 105), RGB(169, 169, 169))
StopDrawing()
StartDrawing(CanvasOutput(#mfCanvas2))
Box(0, 0, 248*Coef, 100*Coef, RGB(169, 169, 169))
DrawingFont(FontID(#font))
DrawText(0, 0, "[--------- PureBasic ----------]", RGB(105, 105, 105), RGB(169, 169, 169))
StopDrawing()
EndProcedure
Procedure Exit()
End
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Question de DPI - A l'aide SVP
Chez moi ton code 2 en 125% zoom à 125% et tout est bien relatif.
~~~~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