Código: Seleccionar todo
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>
#include <GDIPlus.au3>
HotKeySet("{ESC}", "_Exit")
Global $hDCBuffer, $Timer, $Results
$hGui = GUICreate("Test Blur", -1, -1, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
GUISetBkColor(0x227722)
_WinAPI_SetLayeredWindowAttributes($hGui, 0x227722, 220, 0x02)
$iButton = GUICtrlCreateButton("Test", 10, 10, 150, 40)
GUISetState()
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
GUIRegisterMsg($WM_MOVING, "WM_MOVING")
$hDeskDC = _WinAPI_GetDC(0)
$hDC = _WinAPI_GetDC($hGui)
_GDIPlus_Startup()
$hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC)
$hRgn = _WinAPI_CreateRectRgn(10, 10, 160, 50)
_GDIPlus_GraphicsSetClipHrgn($hGraphics, $hRgn, 3)
$hBitmapBuffer = _GDIPlus_BitmapCreateFromGraphics(400, 400, $hGraphics)
$hGraphBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmapBuffer)
$hBrush = _GDIPlus_BrushCreateSolid(0x33550055)
$tRECT = DllStructCreate($tagRECT)
AdlibRegister("AllTimeDrawing", 50)
$WinPos = WinGetPos($hGui) ; Only Once
While True
$iMsg = GuiGetMsg()
If $iMsg = -3 then ExitLoop
If $iMsg = $iButton then consolewrite($Results&@CRLF)
WEnd
_Exit()
Func WM_NCHITTEST($hWndGUI, $MsgID, $WParam, $LParam)
If ($hWndGUI = $hGui) And ($MsgID = $WM_NCHITTEST) Then Return $HTCAPTION
EndFunc ;==>WM_NCHITTEST
Func WM_MOVING($hWndGUI, $MsgID, $WParam, $LParam)
$Timer = TimerInit()
AdlibUnRegister("AllTimeDrawing")
_GDIPlus_GraphicsReleaseDC($hGraphBuffer, $hDCBuffer)
$tRECT = DllStructCreate($tagRECT, $LParam)
$WinPos[0] = DllStructGetData($tRECT, 1)
$WinPos[1] = DllStructGetData($tRECT, 2)
$WinPos[2] = DllStructGetData($tRECT, 3) - $WinPos[0]
$WinPos[3] = DllStructGetData($tRECT, 4) - $WinPos[1]
$hDCBuffer = _GDIPlus_GraphicsGetDC($hGraphBuffer)
_WinAPI_BitBlt($hDCBuffer, 0, 0, 400, 400, $hDeskDC, $WinPos[0] - 1, $WinPos[1] - 1, $SRCCOPY)
_GDIPlus_GraphicsReleaseDC($hGraphBuffer, $hDCBuffer)
_GDIPlus_GraphicsFillRect($hGraphBuffer, 0, 0, 400, 400, $hBrush)
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmapBuffer, 0, 0, 400, 400)
AdlibRegister("AllTimeDrawing", 50)
$Results = TimerDiff($Timer)
Return True
EndFunc ;==>WM_MOVING
Func AllTimeDrawing()
;~ $Timer = TimerInit()
$hDCBuffer = _GDIPlus_GraphicsGetDC($hGraphBuffer)
_WinAPI_BitBlt($hDCBuffer, 0, 0, 400, 400, $hDeskDC, $WinPos[0] - 1, $WinPos[1] - 1, $SRCCOPY)
;~ _WinAPI_StretchBlt($hDCBuffer, 0, 0, 400, 400, $hDeskDC, $WinPos[0]+5, $WinPos[1]+5 , $WinPos[2]-10 , $WinPos[3]-10, $SRCCOPY)
_GDIPlus_GraphicsReleaseDC($hGraphBuffer, $hDCBuffer)
_GDIPlus_GraphicsFillRect($hGraphBuffer, 0, 0, 400, 400, $hBrush)
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmapBuffer, 0, 0, 400, 400)
;~ $Results = TimerDiff($Timer)
EndFunc ;==>AllTimeDrawing
Func _GDIPlus_GraphicsSetClipHrgn($hGraphics, $hRgn, $iCombineMode = 0)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetClipHrgn", "hwnd", $hGraphics, "hwnd", $hRgn, "int", $iCombineMode)
If @error Then Return SetError(@error, @extended, False)
$GDIP_STATUS = $aResult[0]
Return $aResult[0] = 0
EndFunc ;==>_GDIPlus_GraphicsSetClipHrgn
Func _Exit()
AdlibUnRegister("AllTimeDrawing")
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraphBuffer)
_GDIPlus_BitmapDispose($hBitmapBuffer)
_WinAPI_DeleteObject($hRgn)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
_WinAPI_ReleaseDC($hGui, $hDC)
_WinAPI_ReleaseDC(0, $hDeskDC)
Exit
EndFunc ;==>_Exit
Me parece que lo que le falta a esto es el asunto del movimiento de la ventana, también el asunto de ponerle una imagen semi transparente de algun diseño, ya sea rayos, o cualquier cosa que se nos ocurra, va a parecer un adorno esta GUI
.
Sobre el asunto del movimiento de la ventana, algo se me debe estar pasando, AERO de windows debe usar algunas rutinas que no podré hacer en AutoIt pero debe haber un modo de simularlas de mejor manera. el asunto principal de esto es que la ventana causa un blur sobre el fondo, el blur debe ser causado porque una imagen de windows, hasta donde tengo entendido no causa efectos sobre otra imagen, osea que el efecto debe ser generado cada vez que windows repinta el escritorio... mmmh
quiza me equivoque en esto ultimo. Habrá que pensar posibles hipotesis de como lograrlo de manera rapida casi instantanea. igualmente esto tarda 40ms pero se deja ver algunos gliches por ahi.