Lire Position en Z (Zorder) / Savoir de 2 objets quel est celui qui est audessus
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 2012
-
5 janv. 2010 à 15:33
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 2012
-
5 janv. 2010 à 16:29
Bonjour Je souhaite connaître entre 2 objets quel est selui qui est audessus. Je ne compare que des objets se recouvrant.
Quand je dis se recouvrant, il pourrait y avoir un troisième control entre les deux.
Plus généralement, je souhaiterais classer une liste d'objets en fonction de leur ordre de "dépose"
J'ai regardé du côté du ZOrder, mais apparament il est impossible de l'utiliser en lecture
Il y a un bien l'API setWindowPos mais pas de GetWindowPos. ;(
si quelqu'un voi une api ou une méthode VB6 pour trouver
merci d'avance.
'ci apres le code concret de ce sur quoi je médite : c'est dans un control activX
'#########################################################################
Private Sub Dresser_Liste()
'Dresser la liste des objets contenus par le conteneur
On Error Resume Next
Dim Objets As New Collection
Dim Ob As Object
For Each Ob In UserControl.ParentControls
If (Ob.Container.hwnd <> UserControl.Extender.Container.hwnd) Then
'se produit lors d'une erreur : Resume Next
Else
If (Ob.Name <> UserControl.Extender.Name) Or _
(Ob.Index <> UserControl.Extender.Index) Then
'Si l'objet passe sur la zone concernée
If Is_Over_R(Ob.Left, Ob.Top, Ob.Width, Ob.Height, UserControl.Extender.Left, UserControl.Extender.Top, UserControl.Extender.Width, UserControl.Extender.Height) Then
Objets.Add Ob
End If
End If
End If
Next
For Each Ob In Objets
'classer les objs par Zorder ...
Next
End Sub
'Savoir si deux rectangle se supperposent
Private Function Is_Over_R(R1x As Long, R1y As Long, R1w As Long, R1h As Long, _
R2x As Long, R2y As Long, R2w As Long, R2h As Long) As Boolean
Is_Over_R = False
'Savoir si au moins un point du second rectangle recouvre le premier rectangle
Is_Over_R = Is_Over_P(R1x, R1y, R1w, R1h, R2x, R2y)
Is_Over_R = Is_Over_R Or Is_Over_P(R1x, R1y, R1w, R1h, R2x + R2w, R2y)
Is_Over_R = Is_Over_R Or Is_Over_P(R1x, R1y, R1w, R1h, R2x + R2w, R2y + R2h)
Is_Over_R = Is_Over_R Or Is_Over_P(R1x, R1y, R1w, R1h, R2x, R2y + R2h)
If Is_Over_R Then Exit Function 'gain de temps
'Savoir si au moins un point du premier rectangle recouvre le second rectangle
Is_Over_R = Is_Over_P(R2x, R2y, R2w, R2h, R1x, R1y)
Is_Over_R = Is_Over_R Or Is_Over_P(R2x, R2y, R2w, R2h, R1x + R1w, R1y)
Is_Over_R = Is_Over_R Or Is_Over_P(R2x, R2y, R2w, R2h, R1x + R1w, R1y + R1h)
Is_Over_R = Is_Over_R Or Is_Over_P(R2x, R2y, R2w, R2h, R1x, R1y + R1h)
If Is_Over_R Then Exit Function 'gain de temps
'derniers cas possible : recouvrement des centres des rectangles
Is_Over_R = (R1w > R2w) And (R1h < R2w) And _
(R1x < R2x) And (R2x < R1x + R1w) And _
(R2y < R1y) And (R1y < R2y + R2h)
If Is_Over_R Then Exit Function 'gain de temps
Is_Over_R = (R2w > R1w) And (R2h < R1w) And _
(R2x < R1x) And (R1x < R2x + R2w) And _
(R1y < R2y) And (R2y < R1y + R1h)
If Is_Over_R Then Exit Function 'gain de temps
End Function
'Savoir si un point appartient a un rectangle
Private Function Is_Over_P(Rx As Long, Ry As Long, Rw As Long, Rh As Long, Px As Long, Py As Long) As Boolean
Is_Over_P = CBool((Rx <= Px) And (Px <= Rx + Rw)) _
And _
CBool((Ry <= Py) And (Py <= Ry + Rh))
End Function
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 5 janv. 2010 à 15:45
salut,
pas de getwindowpos parce qu'il me semble que c'est getwindowplacement
je ne t'en dis pas plus simplement parce que c'est pour ton contrôle bouton et que tu n'auras pas ce que tu "crois vouloir" !
pourquoi? :
ton bouton détecterait-il l'ajout d'un contrôle dynamique? ou le mouvement du contrôle qu'il surplombe? non. donc ta "capture" serait fausse même si tu avais tous les zorder
désolé
(en même temps comme çà je t'évite de partir sur une mauvaise piste )
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 5 janv. 2010 à 16:29
^^ on ne peut rien leur cacher décidément (ce n'était pas mon intention de toute manière)
en effet je ne détecterais pas l'ajout dynamique (encore que ce n'est pas dit)
en ce qui concerne le WindowPlacement, en effet je l'aivais bien vu sur la toile mais il ne me semble pas que cette API donne un quelconque Zorder.
Enfin, j'ai fini par trouver la solution a mon problème.
La pile (battry) a été trouvée sans faire expret et ma solution également.
c'est tellement bête que j'en rit tout seul sur ma chais
En fait il se trouve que dans mon objet collection (voir code premier post) les controls sont dans l'ordre de Zorder ^^
l'indice le plus petit de la collection est l'objet le plus devant.