Résolu Autres Resolution USERFORM et Ecran

Dudu2

XLDnaute Impliqué
sans api a la taille de l’écran c'est inutile car la taskbar prévaut sur l'affichage donc la partie sera caché par la taskbar
Que nenni ! Pas sur le UserForm.
Screenshot plein écran.
2020-07-30_164153.jpg

VB:
Left = 0
Width = PixelsToPointsX(ScreenWidth)
Top = 0
Height = PixelsToPointsY(ScreenHeight)
 

Dudu2

XLDnaute Impliqué
Je aussi crois avoir compris pourquoi l'option sur fenêtre Excel maximisée laissait chez toi un petite marge. C'est que ta fenêtre Excel maximisée laissait probablement aussi cette marge.
En déplaçant la barre des tâches j'ai eu ce phénomène car utilisant de petites icônes, le réajustement ne se fait pas et Windows considère que la barre des tâches utilise de grandes icônes...et fait donc apparaître cette petite marge entre les fenêtres maximisées et la barre des tâches.

Je passais par hasard pour autre chose, je regarderai ton code celui de Youki ce soir.
 

modus57

XLDnaute Occasionnel
Bonjour à tous,
Je suis intéressé par cette discussion et + particulièrement par les solutions de youky(BJ)
Pouquoi ne ne pas utiliser le zoom
De plus c'est Excel qui gère
1ère macro plein écran
2ème se mets selon la taille de l'application
Je rencontre aucun soucis sur un écran de 15" résolution 1366x76 ou 21" résolution 1920x1080, par contre sur ma tablette 12.3" résolution 2736x1824 l'userform de s'adapte pas tsa taille est plus grande que l'écran ?
Avez-vous une solution ?
Merci d'avance pour vos réponse.
 

Dudu2

XLDnaute Impliqué
tiens avec ca tout simple je suis bon
En effet, tu as bien concentré le truc surtout avec la récupération du RECT de la barre des tâches et ta méthode de conversion PointsToPixels.

Il y a un détail dans l'affichage chez moi qui laisse une faible marge à droite et en bas.
J'avais déjà remarqué que la conversion PointsToPixels que tu utilises donne un résultat légèrement différent de celle que j'utilise. Cette marge se réduit (sans pour autant disparaitre) si on augmente à 10000 le chiffre 100 que tu donnes à PointsToScreenPixelsX.

(ActiveWindow.ActivePane.PointsToScreenPixelsX(100) - ActiveWindow.ActivePane.PointsToScreenPixelsX(0)) / 100 -> 1.67
(ActiveWindow.ActivePane.PointsToScreenPixelsX(10000) - ActiveWindow.ActivePane.PointsToScreenPixelsX(0)) / 10000 -> 1.6667
(ActiveWindow.ActivePane.PointsToScreenPixelsX(100000) - ActiveWindow.ActivePane.PointsToScreenPixelsX(0)) / 100000 -> 1.66667
Le chiffre que je récupère du système est 1.6666666273024
Ces petites décimales font à la fin une différence certes minime, de quelques points, mais réelle.
 

patricktoulon

XLDnaute Barbatruc
re
bonsoir Dudu2
oui en effet on a des décimales un peu différentes
pour mon dernier exemple le principe est simple
j'aime bien les codes simples et clairs
chez moi j'obtiens par le system 1.666666657
tu peux obtenir si tu veux le coeff en lisant le registre
VB:
function PtoPX()as double
PtoPX= CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72
end function
 

Dudu2

XLDnaute Impliqué
Ok, je ne connaissais pas cette méthode pour lire une valeur de registre. Merci pour l'astuce.
Je pense que tu veux dire 1,66666666666667.
Une fois captée par le Shell, à garder en variables module ou en Static.
 

patricktoulon

XLDnaute Barbatruc
re
ou tu la laisse comme tel (une fonction) et tu t'en sert quand tu veux
on peut considérer la fonction comme une variable
ca sert a rien de stoker une variable
 

Dudu2

XLDnaute Impliqué
Je voulais surtout éviter l'exécution répétée d'un Shell et d'une lecture du registre.
Dommage qu'on n'ait pas cette information dans un GetSystemMetrics.
 

patricktoulon

XLDnaute Barbatruc
tiens si tu veux faire peter la caption
n'oublie pas de mettre un bouton fermer ;)
VB:
Option Explicit
#If VBA7 Then
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Private Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As LongPtr, lpRect As RECT) As Long
    Private Declare PtrSafe Function GetDesktopWindow Lib "user32" () As LongPtr
    Private Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
#Else
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
    Private Declare Function GetDesktopWindow Lib "user32" () As Long
    Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

#End If
Private Type RECT: Left As Long: Top As Long: Right As Long: Bottom As Long: End Type

Function ptopx()    'fonction coeff point to pixel
    With ActiveWindow.ActivePane: ptopx = (.PointsToScreenPixelsX(100) - .PointsToScreenPixelsX(0)) / 100: End With
End Function

Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub UserForm_Activate()
    MsgBox GetSystemMetrics(6)
    Dim r1 As RECT, r2 As RECT
    GetWindowRect GetDesktopWindow, r1    'le rectangle de l'ecran
    GetWindowRect FindWindow("shell_traywnd", ""), r2    'le rectangle de la barre des taches
    r1.Bottom = r2.Top + GetSystemMetrics(15) - GetSystemMetrics(5) ' on remplace le bottom de r1 par le r2.top(top taskbar)
    r1.Top = r1.Top - (GetSystemMetrics(15)+  GetSystemMetrics(5))
    'Me.Move 0, 0, Int(r1.Right / ptopx), Int(r1.Bottom / ptopx)    'et on place le userform
    Me.Move 0, r1.Top / ptopx, Int(r1.Right / ptopx), Int(r1.Bottom / ptopx)    'et on place le userform pas de caption

End Sub
 

patricktoulon

XLDnaute Barbatruc
tu en veux une encore plus simple?
pas de soucis
VB:
Option Explicit
#If VBA7 Then
     Private Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
#Else
     Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
#End If
Function ptopx()    'fonction coeff point to pixel
    With ActiveWindow.ActivePane: ptopx = (.PointsToScreenPixelsX(100000) - .PointsToScreenPixelsX(0)) / 100000: End With
End Function

Private Sub UserForm_Activate()
Me.Move 0, 0, GetSystemMetrics(0) / ptopx, (GetSystemMetrics(1) - GetSystemMetrics(14) - GetSystemMetrics(7)) / ptopx
'Me.Move 0, 0, GetSystemMetrics(0) / ptopx, (GetSystemMetrics(1) / ptopx) - (GetSystemMetrics(21) + GetSystemMetrics(7))
End Sub
j'arrete là sinon demain y a plus de code ;):p:p:p
 

Dudu2

XLDnaute Impliqué
Bonjour,
Alors là tu chipotes ;)
Reste toujours <Alt + F4> pour se sortir des mauvais pas quand on ne sait plus où on a placé le UserForm :eek:

J'ai finalisé ma version qui est moins concentrée que la tienne et qui donne toujours 3 options de positionnement.
Sans toujours comprendre pourquoi un GetWindowRect GetActiveWindow, R sur une fenêtre maximisée donne des valeurs extravagantes et pas sur une fenêtre réduite (pas minimisée).
Mais bon, pour le 1er cas, il faut limiter par rapport au max de l'écran moins la TaskBar, c'est du moins comme ça que je l'ai mis sous contrôle.

Edit: 20h25 fichier modifié pour utiliser la correction du post #55 pour simplifier. Le résultat est le même.
 

Fichiers joints

Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour Dudu2
Sans toujours comprendre pourquoi un GetWindowRect GetActiveWindow, R sur une fenêtre maximisée donne des valeurs extravagantes et pas sur une fenêtre réduite (pas minimisée).
j'ai tenté de te l'expliquer mais visiblement je n'y suis pas arrivé
c'est un problème avec Windows 7 thème aero ou basic
une image parlant mieux que milles mots

le même userform, le même fichier, le même jour,la même taille,il y a juste le changement de theme entre les deux capture s
et cela s'applique a tout ce que tu vois a l’écran ;)
c'est pour cela que je t'ai parlé de la dwma.dll et de ces api
demo1.jpg

je regarde ton fichier tout a l'heure je pars en inter dans une demie heure
 

patricktoulon

XLDnaute Barbatruc
re


pour ton fichier
je comprends toujours pas a quoi sert la fonction RatioOccupationÉcran mais bon


test cela en thème basic et aero et regarde bien ou se place le userform
 

Fichiers joints

Dudu2

XLDnaute Impliqué
La fonction RatioOccupationÉcran est un gadget ajouté qui permet de dire par exemple:
"Afficher le UserForm sur la taille de l'écran mais le réduire à 85% par rapport à cette taille."
Edit: j'ai changé le nom en RatioSurDimensionFinale pour (tenter de) clarifier.

test cela en thème basic et aero et regarde bien ou se place le userform
Je sais bien et constate qu'en Aero les entêtes / cadres sont différents.
N.B. je n'ai pas cette légère différence de position constatée sur tes screenshots
Thème Basic:
Usf Basic.jpg

Thème Aero:
Usf Aero.jpg

Mais ça ne justifie en rien que le Left et Top du GetWindowRect GetActiveWindow, r1 soient négatifs sur fenêtre maximisée, et ce dans les 2 modes. Il y a sûrement une raison mais je ne la connais pas. Et ton exemple ne me l'explique pas.

En tous cas, la contre-mesure est simple (voir ci-dessous et avec le fichier joint):
Thème Basic ou Aero:
2020-08-01_223256.jpg
 

Fichiers joints

Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour Dudu2
non pas du tout ni l'un ni l'autre

tu es le premier a me dire que aero et basic positionne l'uf au bon endroit avec W7
et il y a eu des centaines de tests effectués sur pc différent et tous sans exeption on le même comportement
tu est en dpi 100 ou 120 ?
là tu viens vraiment de me poser une sacré colle ;)car
ton theme basic n'est pas comme chez tout le monde il est pas comme çà normalement
 
Dernière édition:

Dudu2

XLDnaute Impliqué
Bonjour PatrickToulon,
Je ne sais pas trop quoi te dire. Je ne pense ps avoir fait des extravagances avec ces settings que je ne manipule jamais. A part le fond d'écran que j'ai modifié pour ne pas avoir ce logo Windows coloré au beau milieu de l'écran.

Je suis en dpi 120 puisque mon Points To Pixels est 1,666666667.
Sans titre 1.jpg
 
Dernière édition:

Dudu2

XLDnaute Impliqué
En fait la notion de "correction" n'est pas très judicieuse, il n'y a rien à "corriger".
C'est juste une question de sélection de la partie visible à l'écran qui s'applique à tous les coins du rectangle en toutes circonstances. J'ai corrigé le post #55.
 

patricktoulon

XLDnaute Barbatruc
re
bonjour Dudu2
ma fois c'est bizarre tu es le premier que je vois avec un thème basic comme ça
1596295093590.jpeg


c'est quelle version de W7 que tu a premium famille ou integrale
et quelle version de excel
 

Fichiers joints

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas