Fonction regioninregion

Contenu du snippet

Suite a une demande sur le Forum ('Fuck'), j'ajoute ma source ici, parce que ca pourrait en interesser certains.

Merci a lui, qui au fil de l'utilisation de la fonction y a trouvé une fuite mémoire, qui est maintenant corrigée

Il s'agit en fait d'une fonction qui permet de savoir si deux regions ont des zones en commun.

En effet, il existe PtInRgn (un point dans une region ?)
ou bien RectInRgn ( un rectangle dans une region ?)
mais pas entre deux régions !!

Pour ce faire, j'utilise l'API CombineRgn. Je demande ainsi la region correspondant a l'intersection des 2 (RGN_AND). Cette API renvoie une valeur particulière si la region créée est vide. On a donc juqu'a tester la valeur renvoyée :)

Source / Exemple :


Option Explicit

Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Long) As Long
Private Const RGN_AND = 1
Private Const NULLREGION = 1

Private Sub Form_Load()
Dim RGN1 As Long, RGN2 As Long

'# Cas d'intersection entre les deux regions
RGN1 = CreateRectRgn(0, 0, 100, 100)
RGN2 = CreateRectRgn(50, 50, 150, 150)

MsgBox "Cas 1 : Intersection entre les 2 régions - " & RgnInRgn(RGN1, RGN2)

'# Cas de non intersection entre les deux regions
RGN1 = CreateRectRgn(0, 0, 100, 100)
RGN2 = CreateRectRgn(150, 150, 250, 250)

MsgBox "Cas 2 : Non-intersection entre les 2 régions - " & Not RgnInRgn(RGN1, RGN2)

End
End Sub

Public Function RgnInRgn(ByVal RGN1 As Long, ByVal RGN2 As Long) As Boolean
'# RGNOUT doit pointer sur une region valide !!
Dim RGNOUT As Long: RGNOUT = CreateRectRgn(0, 0, 0, 0)

'# CombineRGN renvoie NULLREGION si la region est vide
'# Dans le cas présent, on tente d'effectuer une intersection des deux regions. (RGN_AND)
RgnInRgn = NULLREGION <> CombineRgn(RGNOUT, RGN1, RGN2, RGN_AND)
Call DeleteObject ( RGNOUT )
End Function

Conclusion :


La fonction interessante est juste :

Public Function RgnInRgn(ByVal RGN1 As Long, ByVal RGN2 As Long) As Boolean
Dim RGNOUT As Long: RGNOUT = CreateRectRgn(0, 0, 0, 0)
RgnInRgn = NULLREGION <> CombineRgn(RGNOUT, RGN1, RGN2, RGN_AND)
Call DeleteObject ( RGNOUT )
End Function

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.