Définit une région de fenêtre
#include <WinAPIGdi.au3>
_WinAPI_SetWindowRgn ( $hWnd, $hRgn [, $bRedraw = True] )
$hWnd | Handle de la fenêtre dont la région est à définir. |
$hRgn | Handle d'une région. La fonction définit la région de la fenêtre à cette région. |
$bRedraw | [optionnel] Spécifie si le système doit redessiner la fenêtre après la définition de la région de fenêtre. |
Succès: | Retourne True |
Échec: | Retourne False |
La région de la fenêtre détermine la zone à l'intérieur de la fenêtre, où le système permet le dessin.
Le système n'affiche pas une partie quelconque d'une fenêtre qui se trouve en dehors de la région de la fenêtre
Lorsque cette fonction est appelée, le système envoie les messages WM_WINDOWPOSCHANGING et WM_WINDOWPOSCHANGED à la fenêtre.
Les coordonnées de la région de fenêtre d'une fenêtre sont relatives au coin supérieur gauche de la fenêtre, pas à la zone cliente de la fenêtre.
Après un appel réussi à SetWindowRgn, le système devient propriétaire de la région indiquée par le handle de la région $hRgn.
Le système ne fait pas de copie de la région. Ainsi, vous ne devriez pas faire d'autres appels de fonction avec ce handle de région.
En particulier, ne supprimez pas ce handle de région. Le système supprime le handle de région quand il n'en a plus besoin.
_WinAPI_CombineRgn, _WinAPI_CreateRectRgn, _WinAPI_CreateRoundRectRgn, _WinAPI_GetWindowRgn
Consultez SetWindowRgn 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