UDF > WinAPIEx > GDI > Desktop Window Manager >


_WinAPI_DwmExtendFrameIntoClientArea

Agrandit la zone non cliente de la fenêtre au détriment de la zone cliente

#include <WinAPIGdi.au3>
_WinAPI_DwmExtendFrameIntoClientArea ( $hWnd [, $tMARGINS = 0] )

Paramètres

$hWnd Handle de la fenêtre dont le cadre se prolonge dans la zone client.
$tMARGINS [optionnel] Structure $tagMARGINS qui décrit les marges à utiliser lors de l'extension du cadre dans la zone client.
Les marges négatives sont utilisés pour créer l'effet "feuille de verre" où la zone cliente est rendue comme une surface solide, sans bordure de fenêtre (par défaut).

Valeur de retour

Succès: Retourne 1.
Échec: Retourne 0 et définit @error <> 0, @extended contient le code d'erreur HRESULT.

Remarques

Cette fonction doit être appelée chaque fois que la composition Desktop Window Manager (DWM) est activée.
Gérez le message WM_DWMCOMPOSITIONCHANGED pour la notification du changement de composition.

Cette fonction nécessite Windows Vista ou une version ultérieure.

Voir aussi

Consultez DwmExtendFrameIntoClientArea dans la librairie MSDN.

Exemple

#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