Savoir si un objet est caché par un autre(fenêtres, controles ...)

Description

Hello la compagnie

Je participe en ce moment un lecteur Multimédia avec des animations qui consomment beaucoup de puissante de calcul, et pour éviter de devoir faire ces calculs si on ne voit pas la surface (ça sert à rien de faire une animation si on ne la voit pas !), je me suis posé la question de comment savoir si la surface (ici un picturebox) est visible ou masqué par une fenêtre etc. Je vous met donc un exemple. La surface est considérée comme masqué quand les 4 points extremes du rectangle sont recouvert par un autre objet. Vous pouvez bien sur ajouter un taux de tolérence, regardez plus bas, dans le cadre code. J'ai regardé vite fait s'il y avait un exemple sur le site et j'ai rien vu, je poste donc en espérant en aider quelques uns ;)

Fonctionnement : on prend 4 points dans le rectangle décrit par la picturebox (ou moins), et on vérifie s'il sont bien au premier plan ou non grace à l'API WindowFromPoint.

Source / Exemple :


Dim Rec As RECT
GetWindowRect Form2.Picture1.hwnd, Rec
'c'est à la ligne ci dessous qu'on ajoute la tolérence, on peux par exemple vérifier 2 points au lieu de 4, ou encore soustraire un certains chiffre à rec.XXX pour ne pas avoir le rectangle entier du handle.
Label1.Caption = "BOTTOM : " & Rec.Bottom & "| Right : " & Rec.Right & "| TOP : " & Rec.Top & "| LEFT : " & Rec.Left
If WindowFromPoint(Rec.Left, Rec.Top) <> Form2.Picture1.hwnd And WindowFromPoint(Rec.Right, Rec.Top) <> Form2.Picture1.hwnd And WindowFromPoint(Rec.Bottom, Rec.Left) <> Form2.Picture1.hwnd And WindowFromPoint(Rec.Bottom, Rec.Right) <> Form2.Picture1.hwnd Then
Label2.Caption = "Picture 1 est masquée"
Else: Label2.Caption = "Picture 1 n'est pas masquée"
End If

Conclusion :


Bien sur, c'est pas efficace à 100%, par exemple dans le cas ou la picturebox serait recouverte par une autre picturebox plus petite de 2 pixels en hauteur et 2 en largeur, et qui serait placée à X+1,Y+1 par rapport à la picturebox à tester, c'est pour ça qu'on faire une sorte de tolérence à notre guise comme je vous l'ai dit. Pour etre éfficace à 100%, il faudrai vérifier TOUT les points qui sont dans le rectangle décrit, ce qui fait un peu plus de calculs. Vous pouvez bien sur le faire vous même, vous avez la base de travail ;)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.