Combine une région donnée, avec la région de découpage actuelle
#include <WinAPIGdi.au3>
_WinAPI_ExtSelectClipRgn ( $hDC, $hRgn [, $iMode = 5] )
$hDC | Handle du contexte de périphérique. |
$hRgn | Handle de la région à sélectionner. Ce paramètre ne peut être 0 lorsque le mode $RGN_COPY est spécifié. |
$iMode | [optionnel] L'opération à effectuer. Doit être l'une des valeurs suivantes: $RGN_AND $RGN_COPY (par défaut) $RGN_DIFF $RGN_OR $RGN_XOR |
Succès: | Retourne la valeur qui spécifie la complexité de la nouvelle région de découpage; soit l'une des valeurs suivantes: $COMPLEXREGION $NULLREGION $SIMPLEREGION |
Échec: | Retourne 0. |
Consultez ExtSelectClipRgn dans la librairie MSDN.
#include <GUIConstantsEx.au3> #include <GuiTab.au3> #include <MsgBoxConstants.au3> #include <WinAPIGdi.au3> #include <WinAPIGdiDC.au3> #include <WinAPIHObj.au3> #include <WinAPIMisc.au3> #include <WinAPISysWin.au3> #include <WinAPITheme.au3> #include <WindowsConstants.au3> Opt('TrayAutoPause', 0) If Not _WinAPI_DwmIsCompositionEnabled() Then MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Erreur', 'Nécessite Windows Vista ou une version ultérieure avec le thème Aero installé.') Exit EndIf Global Const $PRF_CLIENT = 0x04 OnAutoItExitRegister('OnAutoItExit') ; Crée une GUI Local $hForm = GUICreate('Test '& StringReplace(@ScriptName, '.au3', '()'), 400, 400) GUICtrlCreateTab(0, 60, 402, 341, $WS_CLIPCHILDREN) Global $g_hTab = GUICtrlGetHandle(-1) GUICtrlCreateTabItem('Tab 1') GUICtrlCreateButton('Button', 150, 167, 100, 26) _WinAPI_SetParent(GUICtrlGetHandle(-1), $g_hTab) GUICtrlCreateTabItem('Tab 2') GUICtrlCreateEdit('', 14, 34, 372, 292) _WinAPI_SetParent(GUICtrlGetHandle(-1), $g_hTab) GUICtrlCreateTabItem('Tab 3') GUICtrlCreateTabItem('') GUISetBkColor(0) ; Inscrit Tab window proc Global $g_hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd; uint; wparam; lparam ') Local $pDll = DllCallbackGetPtr($g_hDll) Global $g_hProc = _WinAPI_SetWindowLong($g_hTab, $GWL_WNDPROC, $pDll) ; Crée l'effet "sheet of glass" (surface de verre) pour la zone cliente Tab. Vous devez appeler cette fonction lorsque la composition DWM est activée. _WinAPI_DwmExtendFrameIntoClientArea($hForm, _WinAPI_CreateMargins(2, 2, 82, 2)) GUISetState(@SW_SHOW) Do Until GUIGetMsg() = $GUI_EVENT_CLOSE Func _CreateClipRgn($hWnd) Local $tRECT, $iHtmp, $iHt Local $iCount = _GUICtrlTab_GetItemCount($hWnd) Local $iSel = _GUICtrlTab_GetCurSel($hWnd) Local $hRgn = _WinAPI_CreateNullRgn() For $i = 0 To $iCount - 1 $tRECT = _GUICtrlTab_GetItemRectEx($hWnd, $i) If $i = $iSel Then $iHtmp = _WinAPI_CreateRectRgn(DllStructGetData($tRECT, 1) - 2, DllStructGetData($tRECT, 2) - 2, DllStructGetData($tRECT, 3) + 2, DllStructGetData($tRECT, 4)) $iHt = DllStructGetData($tRECT, 4) - DllStructGetData($tRECT, 2) + 2 Else If $i = $iCount - 1 Then $iHtmp = _WinAPI_CreateRectRgn(DllStructGetData($tRECT, 1), DllStructGetData($tRECT, 2), DllStructGetData($tRECT, 3) - 2, DllStructGetData($tRECT, 4)) Else $iHtmp = _WinAPI_CreateRectRgn(DllStructGetData($tRECT, 1), DllStructGetData($tRECT, 2), DllStructGetData($tRECT, 3), DllStructGetData($tRECT, 4)) EndIf EndIf _WinAPI_CombineRgn($hRgn, $hRgn, $iHtmp, $RGN_OR) _WinAPI_DeleteObject($iHtmp) Next $tRECT = _WinAPI_GetClientRect($hWnd) $iHtmp = _WinAPI_CreateRectRgn(DllStructGetData($tRECT, 1), DllStructGetData($tRECT, 2) + $iHt, DllStructGetData($tRECT, 3) - 2, DllStructGetData($tRECT, 4) - 1) _WinAPI_CombineRgn($hRgn, $hRgn, $iHtmp, $RGN_OR) _WinAPI_DeleteObject($iHtmp) Return $hRgn EndFunc ;==>_CreateClipRgn Func _WinProc($hWnd, $iMsg, $wParam, $lParam) If _WinAPI_IsThemeActive() Then Local $hRgn Switch $iMsg Case $WM_ERASEBKGND Local $hPrev = _WinAPI_GetClipRgn($wParam) $hRgn = _CreateClipRgn($hWnd) _WinAPI_ExtSelectClipRgn($wParam, $hRgn, $RGN_DIFF) Local $tRECT = _WinAPI_GetClientRect($hWnd) Local $hBrush = _WinAPI_CreateSolidBrush(0) _WinAPI_FillRect($wParam, DllStructGetPtr($tRECT), $hBrush) _WinAPI_SelectClipRgn($wParam, $hPrev) _WinAPI_DeleteObject($hBrush) _WinAPI_DeleteObject($hRgn) Return 1 Case $WM_PAINT Local $tPAINTSTRUCT Local $hDC = _WinAPI_BeginPaint($hWnd, $tPAINTSTRUCT) $hRgn = _CreateClipRgn($hWnd) _WinAPI_ExtSelectClipRgn($hDC, $hRgn, $RGN_AND) _WinAPI_CallWindowProc($g_hProc, $hWnd, $WM_PRINTCLIENT, $hDC, $PRF_CLIENT) _WinAPI_DeleteObject($hRgn) _WinAPI_EndPaint($hWnd, $tPAINTSTRUCT) Return 0 EndSwitch EndIf Return _WinAPI_CallWindowProc($g_hProc, $hWnd, $iMsg, $wParam, $lParam) EndFunc ;==>_WinProc Func OnAutoItExit() _WinAPI_SetWindowLong($g_hTab, $GWL_WNDPROC, $g_hProc) DllCallbackFree($g_hDll) EndFunc ;==>OnAutoItExit