XL 2016 VBA - Taux de recouvrement d'un RECT par un autre RECT

Dudu2

XLDnaute Barbatruc
Bonjour à tous,

Le point de départ de ce problème est la question "doit-on changer le OWNER d'un UserForm" ?
Parce que s'il est placé ou déplacé sur l'une des fenêtres d'un classeur qui n'est pas son OWNER, on le sait grâce à l'évènement UserForm_Layoit(), il sera masqué totalement ou partiellement par cette fenêtre dès lors qu'elle sera active. Et dans ce cas, il faut changer son OWNER par le Handle de la fenêtre en question.

D'où la question... Quel est le taux de recouvrement du UserForm RECT par un Window RECT.

La fonction PourcentageUserFormSurfaceCouverteParWindow dans ce fichier est à écrire !
 

Pièces jointes

  • Classeur5.xlsm
    29.9 KB · Affichages: 1
Dernière édition:

Dudu2

XLDnaute Barbatruc
OK merci pour vos retours.

C'était un truc à l'aveugle avec un And sur &HFF donc ça m'étonne pas que ça fonctionne pas en 32 bits.
VB:
Function LeUserFormEstIlEnTaksBar() As Variant  'Boolean
    Dim iStyle As Variant
    
    iStyle = GetWindowLongPtr(UserFormHandle, GWL_EXSTYLE)
    LeUserFormEstIlEnTaksBar = Not CBool(iStyle And &HFF)
End Function
 

Dudu2

XLDnaute Barbatruc
Allez, un dernier test... Quant à faire un truc bourrin !
Pouvez-vous me dire les 2 valeurs retournées en 32 bits selon que c'est en TaksBar ou pas ?
Chez moi 64 bits:
- En standard: 256 ou 257
- En Taskbar: 262400
 

Pièces jointes

  • Classeur1.xlsm
    32.8 KB · Affichages: 1

patricktoulon

XLDnaute Barbatruc
re
avant d'essayer ton dernier fichier je peux te dire pourquoi ça ne fonctionne pas
si tu avais pris le temps de regarder la video j'explique justement ça ;)
je le répète il faut faire les choses dans un certain ordre
avec ton fichier 1 je suis déjà à 256 et 262400
 

Dudu2

XLDnaute Barbatruc
Si vous avez ces chiffres qui sont les mêmes que les miens, alors je ne comprends pas pourquoi le test du fichier donne des résultats différents puisque c'est juste un AND avec un 0xFF.

Sinon, sur la base de ce sujet de stackoverflow, une approche un peu moi aveugle... A tester encore !
 

Pièces jointes

  • Classeur1.xlsm
    32.8 KB · Affichages: 1

Dudu2

XLDnaute Barbatruc
La fonction c'était ça. Sachant que les 256/257 et 262400 sont les iStyle.
VB:
Function LeUserFormEstIlEnTaksBar() As Variant  'Boolean
    Dim iStyle As Variant
   
    iStyle = GetWindowLongPtr(UserFormHandle, GWL_EXSTYLE)
    LeUserFormEstIlEnTaksBar = Not CBool(iStyle And &HFF)
End Function
 

Dudu2

XLDnaute Barbatruc
C'est un test bidon que j'ai fait à l'aveugle qui en plus ne fonctionne pas pour 256.
C'est pour ça que les résultats sont différents en fonction de la valeur que prend le iStyle en affichage standard 256 ou 257.
J'ai tout faux sur ce fichier. Mea culpa !
VB:
Sub a()
    MsgBox "256->" & (Not CBool(256 And &HFF)) & vbCrLf & _
           "257->" & (Not CBool(257 And &HFF)) & vbCrLf & _
           "262400->" & (Not CBool(262400 And &HFF))
End Sub
1718566612745.png


Je préfèrerais que tu testes le fichier du Post #36.

Dans le pire des cas je testerai sur les valeurs du iStyle 256/257 ou 262400. Ou discriminer sur 262400.
Puisque je n'ai rien trouvé dans les API pour déterminer si une Window est dans la TaskBar.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Merci @Dranreb pour cette confirmation.
C'est moins bourrin que le 262400 mais ce n'est pas non plus la panacée car ce masque CBool(iStyle And WS_EX_APPWINDOW) n'est en rien un indicateur de présence en TaskBar. Je l'ai utilisé en parcourant toutes les Windows du Desktop et ça ne marche absolument pas dans cette perspective. Mais ça semble marcher pour une Window de UserForm alors je vais m'accrocher à cette petite branche.
 

Discussions similaires

Statistiques des forums

Discussions
312 964
Messages
2 094 010
Membres
105 912
dernier inscrit
willou3869