begin process at 2012 02 16 19:34:07
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > FONCTION REGIONINREGION

FONCTION REGIONINREGION


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

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

Auteur : Renfield

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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


 Sources du même auteur

Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ...
Source avec Zip Source avec une capture JSON PARSER - ANALYSE DE CHAINES JSON
Source avec Zip Source avec une capture MODULE DE TÉLÉCHARGEMENT DE FICHIER BASIQUE (SYNCHRONE / ASY...
Source avec Zip COURS DE PILOTAGE........D'APPLICATIONS
Source avec Zip CSOCKET - REMPLACEZ WINSOCK PAR LA VERSION 2 DES API

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) .NET DEPENDENCY VIEWER : ARBRE DES DÉPENDANCES D'UN ASSEMBLY... par ShareVB
Source avec Zip Source .NET (Dotnet) UTILITAIRE SKYDRIVE par MasterShadows
Source avec Zip ROTATION RAPIDE D'IMAGE par trex70
Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ... par Renfield
Source avec Zip Source avec une capture MOUSE SPEED AND WEIGHT : RETOUR DE FORCE VIRTUEL ! par ScSami

Commentaires et avis

Commentaire de fuck le 05/10/2003 12:05:56

Merci renfield je te mais 10

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

Commentaire de RaZoR le 05/10/2003 16:31:00

ça sert à quoi une region ??

Commentaire de OphidiaN le 05/10/2003 16:46:31

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

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.

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

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

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.

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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,292 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales