UDF > WinAPIEx > GDI > Regions >


_WinAPI_CombineRgn

Combine deux r�gions et stocke le r�sultat dans une troisi�me r�gion

#include <WinAPIGdi.au3>
_WinAPI_CombineRgn ( $hRgnDest, $hRgnSrc1, $hRgnSrc2, $iCombineMode )

Param�tres

$hRgnDest Handle de la nouvelle r�gion avec des dimensions d�finies en combinant les deux autres r�gions. (Cette r�gion doit exister avant que CombineRgn soit appel�e.)
$hRgnSrc1 Handle de la premi�re des deux r�gions � combiner.
$hRgnSrc2 Handle de la seconde des deux r�gions � combiner.
$iCombineMode Sp�cifie le mode de combinaison des deux r�gions. Ce param�tre peut prendre l'une des valeurs suivantes.
$RGN_AND - Cr�e l'intersection des deux r�gions combin�es.
$RGN_COPY - Cr�e une copie de la r�gion identifi�e par $hRgnSrc1.
$RGN_DIFF - Combine les parties de $hRgnSrc1 qui ne font pas partie de $hRgnSrc2.
$RGN_OR - Cr�e l'union de deux r�gions combin�es.
$RGN_XOR - Cr�e l'union de deux r�gions combin�es � l'exception des zones de recouvrement.

Valeur de retour

Succ�s: Retourne le type de la r�gion qui r�sulte de la combinaison. Ce peut �tre l'une des valeurs suivantes.
$NULLREGION - La r�gion est vide.
$SIMPLEREGION - La r�gion est un simple rectangle.
$COMPLEXREGION - La r�gion est plus qu'un simple rectangle.
�chec: Retourne 0 - Aucune r�gion n'est cr��e.

Remarque

Les deux r�gions sont combin�s selon le mode sp�cifi�.
Les trois r�gions peuvent ne pas �tre distincte. Par exemple, le param�tre $hRgnSrc1 peut �tre �gal au param�tre $hRgnDest.

En relation

_WinAPI_CreateRectRgn, _WinAPI_CreateRoundRectRgn, _WinAPI_GetWindowRgn, _WinAPI_SetWindowRgn

Voir aussi

Consultez CombineRgn dans la librairie MSDN.

Exemple

#include <GUIConstantsEx.au3>
#include <WinAPIGdi.au3>
#include <WinAPIHObj.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

; Obtient la hauteur de titre de la fen�tre et la largeur de cadre de fen�tre - peut �tre diff�rent suivant que les th�mes XP sont ON/OFF
Global $g_iHtit = _WinAPI_GetSystemMetrics($SM_CYCAPTION)
Global $g_iFrame = _WinAPI_GetSystemMetrics($SM_CXDLGFRAME)

Global $g_hGui = GUICreate("Test Windows regions", 350, 210)
Local $id_Default = GUICtrlCreateButton("Default region", 100, 30, 150)
Local $id_Round = GUICtrlCreateButton("Round region", 100, 60, 150)
Local $id_Buble = GUICtrlCreateButton("Buble region ", 100, 90, 150)
Local $id_Transparent = GUICtrlCreateButton("Transparent region", 100, 120, 150)
Local $id_Exit = GUICtrlCreateButton("Exit", 100, 150, 150)
GUISetState(@SW_SHOW)

Local $aPos = WinGetPos($g_hGui) ; Obtient la taille enti�re de la fen�tre (pas la taille de la zone client d�finie dans GUICreate)
Global $g_iWidth = $aPos[2]
Global $g_iHeight = $aPos[3]

Local $hRgn, $iMsg = GUIGetMsg()
While $iMsg <> $GUI_EVENT_CLOSE And $iMsg <> $id_Exit
    Select
        Case $iMsg = $id_Default
            $hRgn = _WinAPI_CreateRectRgn(0, 0, $g_iWidth, $g_iHeight)
            _WinAPI_SetWindowRgn($g_hGui, $hRgn)

        Case $iMsg = $id_Round
            $hRgn = _WinAPI_CreateRoundRectRgn(0, 0, $g_iWidth, $g_iHeight, $g_iWidth / 3, $g_iHeight / 3)
            _WinAPI_SetWindowRgn($g_hGui, $hRgn)

        Case $iMsg = $id_Buble
            Local $hRgn1 = _WinAPI_CreateRoundRectRgn(0, 0, $g_iWidth / 2, $g_iHeight / 2, $g_iWidth / 2, $g_iHeight / 2) ; sup�rieur gauche
            Local $hRgn2 = _WinAPI_CreateRoundRectRgn($g_iWidth / 2, 0, $g_iWidth, $g_iHeight / 2, $g_iWidth / 2, $g_iHeight / 2) ; en haut � droite
            _WinAPI_CombineRgn($hRgn1, $hRgn1, $hRgn2, $RGN_OR)
            _WinAPI_DeleteObject($hRgn2)
            $hRgn2 = _WinAPI_CreateRoundRectRgn(0, $g_iHeight / 2, $g_iWidth / 2, $g_iHeight, $g_iWidth / 2, $g_iHeight / 2) ; inf�rieur gauche
            _WinAPI_CombineRgn($hRgn1, $hRgn1, $hRgn2, $RGN_OR)
            _WinAPI_DeleteObject($hRgn2)
            $hRgn2 = _WinAPI_CreateRoundRectRgn($g_iWidth / 2, $g_iHeight / 2, $g_iWidth, $g_iHeight, $g_iWidth / 2, $g_iHeight / 2) ; en bas � droite
            _WinAPI_CombineRgn($hRgn1, $hRgn1, $hRgn2, $RGN_OR)
            _WinAPI_DeleteObject($hRgn2)
            $hRgn2 = _WinAPI_CreateRoundRectRgn(10, 10, $g_iWidth - 10, $g_iHeight - 10, $g_iWidth, $g_iHeight) ; milieu
            _WinAPI_CombineRgn($hRgn1, $hRgn1, $hRgn2, $RGN_OR)
            _WinAPI_DeleteObject($hRgn2)
            _WinAPI_SetWindowRgn($g_hGui, $hRgn1)

        Case $iMsg = $id_Transparent
            _GuiHole($g_hGui, 40, 40, 260, 170)

    EndSelect
    $iMsg = GUIGetMsg()
WEnd

; D�finit la zone int�rieure transparente, mais ajoute des contr�les
Func _GuiHole($hWin, $iX, $iY, $iSizeW, $iSizeH)
    Local $hOuter_rgn, $hInner_rgn, $hCombined_rgn

    $hOuter_rgn = _WinAPI_CreateRectRgn(0, 0, $g_iWidth, $g_iHeight)
    $hInner_rgn = _WinAPI_CreateRectRgn($iX, $iY, $iX + $iSizeW, $iY + $iSizeH)
    $hCombined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    _WinAPI_CombineRgn($hCombined_rgn, $hOuter_rgn, $hInner_rgn, $RGN_DIFF)
    _WinAPI_DeleteObject($hOuter_rgn)
    _WinAPI_DeleteObject($hInner_rgn)
    _AddCtrlRegion($hCombined_rgn, $id_Default)
    _AddCtrlRegion($hCombined_rgn, $id_Round)
    _AddCtrlRegion($hCombined_rgn, $id_Buble)
    _AddCtrlRegion($hCombined_rgn, $id_Transparent)
    _AddCtrlRegion($hCombined_rgn, $id_Exit)
    _WinAPI_SetWindowRgn($hWin, $hCombined_rgn)
EndFunc   ;==>_GuiHole

; Ajoute une zone de contr�le � la r�gion donn�e
; en respectant aussi les tailles du titre/cadre de la fen�tre 
Func _AddCtrlRegion($hFull_rgn, $idCtrl)
    Local $aCtrl_pos, $hCtrl_rgn

    $aCtrl_pos = ControlGetPos($g_hGui, "", $idCtrl)
    $hCtrl_rgn = _WinAPI_CreateRectRgn($aCtrl_pos[0] + $g_iFrame, $aCtrl_pos[1] + $g_iHtit + $g_iFrame, _
            $aCtrl_pos[0] + $aCtrl_pos[2] + $g_iFrame, $aCtrl_pos[1] + $aCtrl_pos[3] + $g_iHtit + $g_iFrame)
    _WinAPI_CombineRgn($hFull_rgn, $hFull_rgn, $hCtrl_rgn, $RGN_OR)
    _WinAPI_DeleteObject($hCtrl_rgn)
EndFunc   ;==>_AddCtrlRegion