Lire Position en Z (Zorder) / Savoir de 2 objets quel est celui qui est audessus

Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 - 5 janv. 2010 à 15:33
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 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


merci d'avance ^^

2 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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 )
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
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.

^^
0
Rejoignez-nous