Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

FONCTION REGIONINREGION


Information sur la source

Catégorie :API Niveau : Débutant Date de création : 05/10/2003 Date de mise à jour : 24/10/2003 21:31:29 Vu : 2 323

Note :
8,5 / 10 - par 6 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note


Description

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

  • 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
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
 

Commentaires et avis

signaler à un administrateur
Commentaire de fuck le 05/10/2003 12:05:56

Merci renfield je te mais 10

signaler à un administrateur
Commentaire de DARKSIDIOUS le 05/10/2003 14:27:46 administrateur CS

Ouais, c'est vrai que c'est bien pratique

9/10

DarK Sidious

signaler à un administrateur
Commentaire de RaZoR le 05/10/2003 16:31:00

ça sert à quoi une region ??

signaler à un administrateur
Commentaire de OphidiaN le 05/10/2003 16:46:31

a faire des objets de &lt;&gt; formes (fenetres, boutons...)

signaler à un administrateur
Commentaire de Inekman le 09/10/2003 19:32:31

Y'a t'il des sources sur le site explicant le fonctionnement des régions, notamment en montrant la création d'objet "de &lt;&gt; formes" ?

Merci.

signaler à un administrateur
Commentaire de fuck le 24/10/2003 21:06:56

Il y a un bug a long termes et  a utilisation multiples pour le resoudres il suffit de rajouter a la fonction : DeleteObject RGNOUT

ainsi :

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 &lt;&gt; CombineRgn(RGNOUT, RGN1, RGN2, RGN_AND)
DeleteObject RGNOUT ' Important sinon ca peut planter, j'ai fais des test.

End Function

Sinon une régions se créra et prendra tout l'ecran en modifiant les fenêtre, cette version marche normalent

signaler à un administrateur
Commentaire de Renfield le 24/10/2003 21:25:20 administrateur CS

oui, en y repensant legeremment, c'est vrai que c'est logique, on cré a chaque fois une nouvelle region, en ca s'entasse en memoire.....

signaler à un administrateur
Commentaire de Silmon le 16/01/2006 14:51:30

Renfield merci pour ton code
Ça va m'etre très utile.

Juste une question:
Sous windows XP, lorsque j'applique une region dans une form,
elle perd l'aspect XP.
Sais-tu pourquoi?
Existe-t-il un moyen "d'anuler une region" dans une form
pour retrouver l'aspect original?

Merci d'avance.

signaler à un administrateur
Commentaire de peug le 08/01/2008 07:35:10 10/10

Ce que je cherche Renfield l'invente

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,593 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.