Agrandit la zone non cliente de la fenêtre au détriment de la zone cliente
#include <WinAPIGdi.au3>
_WinAPI_DwmExtendFrameIntoClientArea ( $hWnd [, $tMARGINS = 0] )
$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). |
Succès: | Retourne 1. |
Échec: | Retourne 0 et définit @error <> 0, @extended contient le code d'erreur HRESULT. |
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.
Consultez DwmExtendFrameIntoClientArea 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