Combine deux régions et stocke le résultat dans une troisième région
#include <WinAPIGdi.au3>
_WinAPI_CombineRgn ( $hRgnDest, $hRgnSrc1, $hRgnSrc2, $iCombineMode )
$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. |
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. |
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.
_WinAPI_CreateRectRgn, _WinAPI_CreateRoundRectRgn, _WinAPI_GetWindowRgn, _WinAPI_SetWindowRgn
Consultez CombineRgn dans la librairie MSDN.
#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