Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Quoi de moins simple que de déterminer le RECT d'une fenêtre ? Fichier pour test...

Dudu2

XLDnaute Barbatruc
Bonjour,

Pour des raisons qui m'échappent, les coordonnées d'une fenêtre ont des valeurs farfelues lorsque cette fenêtre est maximisée.
Ainsi:
VB:
With ActiveWindow
    .Left
    .Top
    .Width
    .Height
End With
ne correspondent pas à la réalité, du moins celle qui pourrait servir à position un UserForm aux limites de la fenêtre pas exemple.

Aussi, j'ai dû passer par de l'API pour déterminer l'exact RECT (pixels) d'une fenêtre qui doit rester valide en multi-moniteurs.
Et bingo, bug excel (chez moi en tous cas) lorsque la TaskBar n'est pas en bas sur la fonction API GetClientRect() qui retourne 1 pixel de moins que prévu en Bottom !

Alors j'ai 2 versions de cette fonction utilisateur GetWindowExactRECT et GetWindowExactRECTSimple et j'aimerais que quelques XLDNautes dévoués aux causes perdues fassent le test suivant.
  1. Lancer le fichier ci-dessous
  2. Maximiser la fenêtre Excel si elle ne l'est pas déjà
  3. Pour chaque position de barre des tâches en bas, à gauche, en haut, à droite
    a) - Vérifier que les 2 résultats affichées des RECT de la fenêtre sont identiques
    b) Vérifier qu'ils sont cohérents avec la dimension de l'écran en pixels
Merci par avance.
 

Pièces jointes

  • Test WindowExactRECT.xlsm
    33.8 KB · Affichages: 6
Solution
C'est ça, en fait ça n'a pas tellement de sens de chercher ou d'utiliser le RECT de la fenêtre.
Car en Maximisé, si Excel dit que Left et Top c'est -8 ou -9 c'est que ce sont les valeurs telles qu'il les gère.
Cependant, ce RECT est inexploitable pour positionner un UserForm.

Le seule chose qui soit exploitable c'est le RECT de la fenêtre corrigé des marges qu'on trouve en calculant la différence de largeur et de hauteur entre le GetWindowRECT et le GetClientRECT corrigé du potentiel bug Excel sur le ClientRECT.Bottom quand la fenêtre est maximisée et la barre des tâches pas en bas ou en antohide.
Sans bug Excel c'est moins amusant !

C'est ce que font maintenant la fonction...

patricktoulon

XLDnaute Barbatruc
@maximisées les windows sont sensées occuper tout le rcwork que je sache non ?
tu vois le truc ou pas ?
moi ce qui m’étonne c'est que tu fait tout un bataillon alors que le rcwork de chaque écran est sensé te donner
le rect sans la taskbar ou autres docksides

maximisé =le rcwork
minimisé= les left/top/et le reste en point *ppx
et c'est tout
en fait ce que je te dis depuis ma première intervention dans cette discussion c'est de prendre le problème à l'envers

chez moi ça tombe juste sur les deux écrans et je ne calcule rien pas de bordures de frame et autre cochonnerie que ce soit pour l'application ou un userform

d'autant plus que si tu a x écrans de différentes résolutions (ce qui est mon cas) que tu cherche a déduire la taskbar ben tu dois bien rigoler par exemple chez moi sur l’écran tv elle fait 40 et sur le ptit écran elle fait 33
c'est balo!!
 

Dudu2

XLDnaute Barbatruc
@patricktoulon,
Il ne sert à rien de savoir si la fenêtre est maximisée ou pas.
On récupère sa position grâce à l'API GetWindowRECT et applique une correction des marges grâce à GetClientRECT. C'est tellement simple que tout le monde comprends.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
@TooFatBoy,
Ta config de TaskBar en autohide a mis en évidence une lacune dans une des 2 fonctions que j'ai corrigé.
Le bug Excel sur ClientRECT.Bottom est aussi présent en TaskBar autohide chez moi.
Chez toi, je ne sais pas.

Alors peux-tu STP exécuter le fichier joint pour afficher les marges DiffX et DiffY (peu importe la position de la TaskBar qui est en autohide). Ensuite j'adapterai le code du fichier solution.
 

Pièces jointes

  • Test Marges WindowRECT & ClientRECT.xlsm
    21.4 KB · Affichages: 1

Dudu2

XLDnaute Barbatruc
16 et 16, c'est très contrariant pour moi car le bug Excel ne se manifeste pas chez toi en TaskBar autohide ! Tu dois avoir une version récente d'Office où c'est corrigé (supposition).


Donc la correction que je fais pour chez moi pour ramener 19 à 18 sur la base de la TaskBar n'est pas applicable chez toi !
Je vais procéder différemment et n'utiliser que la version simple car cette différence de 1 est inhibée par la division entière par 2 sachant que DiffX et DiffY sont normalement paires puisqu'ils contiennent les marges des 2 cotés.
 

patricktoulon

XLDnaute Barbatruc
ha oui
je reprends ta formulation

et selon toi ton calcul est sensé me donner quoi avec ça en maximisé
VB:
Declare PtrSafe Function GetClientRect Lib "user32" (ByVal hwnd As LongPtr, lpRect As rect) As Long
Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As LongPtr, lpRect As rect) As Long
Private Type rect
    left As Long
    top As Long
    right As Long
    bottom As Long
End Type
Sub test()
    Dim r1 As rect, r2 As rect, r3 As rect
    GetWindowRect Application.hwnd, r1
    GetClientRect Application.hwnd, r2

    Debug.Print "GetWindowRect : " & r1.left & " | " & r1.top & " | " & r1.right & " | " & r1.bottom
    Debug.Print "GetClientRect : " & r2.left & " | " & r2.top & " | " & r2.right & " | " & r2.bottom

    DiffX = (r1.right - r1.left) - (r2.right - r2.left)
    DiffY = (r1.bottom - r1.top) - (r2.bottom - r2.top)

    With r3
        .left = r1.left + Int(DiffX / 2)
        .right = r1.right - Int(DiffX / 2) + DiffX Mod 2
        .top = r1.top + Int(DiffY / 2) + DiffX Mod 2
        .bottom = r1.bottom - Int(DiffY / 2) + DiffY Mod 2
    End With

    Debug.Print "rect final : " & r3.left & " | " & r3.top & " | " & r3.right & " | " & r3.bottom


End Sub
tu veux voir le résultat?et je te fait grâce du 1pixel en maximisé


alors que le rcwork de mon moniteur me donne 860
alors ma methode avec le systeminfo me donne 860
alors que ma méthode avec les fenêtre fille me donnent 860
alors que le simple .top+.height *ppx me donne 860
chez moi il y a 4 de trop -2 pour le top et 2 pour le bottom

je ne sais pas comment tu arrive a un bon résultat chez toi mais en tout cas il ne peut être générique
et pour le coup tu le vois en animation ya pas de triche

et c'est ton code j'ai juste changé le nom des rect
 

Dudu2

XLDnaute Barbatruc
Merci pour le test @TooFatBoy, les coordonnées sont correctes.
Cependant je ne comprends pas pourquoi tu n'as pas la position et l'autohide de la barre des tâches.


C'est un autre sujet, mais la fonction GetTaskBarPosition() ne retourne pas une valeur correcte.
Encore un mystère... du 32 bits ? Je vais investiguer. D'ailleurs je ne suis pas sûr d'avoir bien utilisé SHAppBarMessaget() pour ça.
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…