# Function Reference

# _WinAPI_ExtSelectClipRgn

Combines the specified region with the current clipping region

#include <WinAPIGdi.au3>
_WinAPI_ExtSelectClipRgn ( $hDC, $hRgn [, $iMode = $RGN_COPY] )

## Parameters

$hDC | Handle to the device context.
$hRgn | Handle to the region to be selected. This parameter can only be 0 when the $RGN_COPY mode is specified.
$iMode | [optional] The operation to be performed. It must be one of the following values. $RGN_AND $RGN_COPY (Default) $RGN_DIFF $RGN_OR $RGN_XOR

## Return Value

Success: | The value that specifies the new clipping region's complexity; it can be one of the following values. $COMPLEXREGION $NULLREGION $SIMPLEREGION
Failure: | 0.

## See Also

Search ExtSelectClipRgn in MSDN Library.

## Example

    #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 <WindowsNotifsConstants.au3>
    #include <WindowsStylesConstants.au3>

    Opt('TrayAutoPause', 0)

    If Not _WinAPI_DwmIsCompositionEnabled() Then
        MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), 'Error', 'Require Windows Vista or later with enabled Aero theme.')
        Exit
    EndIf

    Global Const $PRF_CLIENT = 0x04

    OnAutoItExitRegister('OnAutoItExit')

    ; Create 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) ; Black

    ; Register 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)

    ; Create the "sheet of glass" effect for the Tab client area. You must call this function whenever DWM composition is toggled.
    _WinAPI_DwmExtendFrameIntoClientArea($hForm, _WinAPI_CreateMargins(2, 2, 82, 2))

    GUISetState(@SW_SHOW)

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    Func _CreateClipRgn($hWnd)
        Local $tRECT, $hTmp, $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
                $hTmp = _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
                    $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRECT, 1), DllStructGetData($tRECT, 2), DllStructGetData($tRECT, 3) - 2, DllStructGetData($tRECT, 4))
                Else
                    $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRECT, 1), DllStructGetData($tRECT, 2), DllStructGetData($tRECT, 3), DllStructGetData($tRECT, 4))
                EndIf
            EndIf
            _WinAPI_CombineRgn($hRgn, $hRgn, $hTmp, $RGN_OR)
            _WinAPI_DeleteObject($hTmp)
        Next
        $tRECT = _WinAPI_GetClientRect($hWnd)
        $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRECT, 1), DllStructGetData($tRECT, 2) + $iHt, DllStructGetData($tRECT, 3) - 2, DllStructGetData($tRECT, 4) - 1)
        _WinAPI_CombineRgn($hRgn, $hRgn, $hTmp, $RGN_OR)
        _WinAPI_DeleteObject($hTmp)
        Return $hRgn
    EndFunc   ;==>_CreateClipRgn

    Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
        If _WinAPI_IsThemeActive() Then
            Local $hRgn
            Switch $iMsg
                Case $WM_ERASEBKGND * - 1 ; never used under this script ???
                    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, $tRECT, $hBrush)
                    _WinAPI_SelectClipRgn($wParam, $hPrev)
                    _WinAPI_DeleteObject($hBrush)
                    _WinAPI_DeleteObject($hRgn)
                    Return 1
                Case $WM_PAINT
                    ; paint around the Tabs
                    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