En el ejemplo veran un triangulo girando y comprobaran que cuando el mouse pasa por encima de una parte dibujada del triangulo, el cursor cambia, si hacen click en el el triángulo deja de girar y si arrastran el cursor hacia un lado mientras mantienen presionado el botón izquierdo podrán modificar la velocidad de giro del triángulo.
Traté de agregarle un efecto de luces al trabajo, pero mi algoritmo ha fallado(todabía me falta práctica con eso), pero lo he toqueteado aleatoreamente y ha quedado un efecto Random que va bién.
Para que puedan ejecutarlo van a tener que bajarse y copiar a su carpetas de includes la librería GDIP.au3 escrita por Authenticity que contiene más funciones de GDI+ de las que ya hay en GDIPlus.au3
Bueno les dejo el ejemplo este. Suerte ;)
Código: Seleccionar todo
#include <GDIP.au3>
#include <winapi.au3>
#include <Misc.au3>
#include <array.au3>
Opt("MouseCoordMode", 2)
_GDIPlus_Startup()
$hGui = GUICreate("GDI+ Eventos por monoscout999", 300, 300)
$iPic = GUICtrlCreatePic("", 0, 0, 300, 300)
GUISetState()
Global $hDll = DllOpen("user32.dll")
Global $RotAng = 1
Global $status
Global $aColors[4] = [3, 0xFF550000, 0xFF550000, 0xFFAA0000]
Global $aPoints[4][2] = [[3],[63, 200],[237, 200],[150, 50]]
Global $aPathPoints[4][2] = [[3],[-87, 50],[87, 50],[0, -100]] ; All elements - 150
$hGraphics = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($iPic))
_GDIPlus_GraphicsClear($hGraphics, 0xFF123456)
_GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)
$hBrush = _GDIPlus_PathBrushCreate($aPoints)
_GDIPlus_PathBrushSetCenterColor($hBrush, 0xFFFFFFFF)
_GDIPlus_PathBrushSetSurroundColorsWithCount($hBrush, $aColors)
$hGBitmap = _GDIPlus_BitmapCreateFromGraphics(300, 300, $hGraphics)
$hGBackbuffer = _GDIPlus_ImageGetGraphicsContext($hGBitmap)
$hPath = _GDIPlus_PathCreate()
$hMatrix = _GDIPlus_MatrixCreate()
_GDIPlus_MatrixTranslate($hMatrix, 150, 150)
AdlibRegister("Rotate", 20)
While True
$iMsg = GUIGetMsg()
Switch $iMsg
Case -3
Exit
EndSwitch
$status = _GDIPlus_PathIsVisiblePoint($hPath, MouseGetPos(0), MouseGetPos(1), $hGraphics)
If $status = True Then
GUISetCursor(14, 1, $hGui)
$MousePos = MouseGetPos(0)
While _IsPressed(0x01, $hDll)
$RotAng = Int((MouseGetPos(0) - $MousePos) / 50)
Opt("MouseCoordMode", 1)
ToolTip($RotAng, MouseGetPos(0) + 20, MouseGetPos(1) + 20, "Velocidad de rotación")
Opt("MouseCoordMode", 2)
WEnd
ToolTip("")
Else
GUISetCursor(-1, 1, $hGui)
EndIf
WEnd
AdlibUnRegister("Rotate")
_GDIPlus_MatrixDispose($hMatrix)
_GDIPlus_PathDispose($hPath)
_GDIPlus_GraphicsDispose($hGBackbuffer)
_GDIPlus_BitmapDispose($hGBitmap)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
DllClose($hDll)
Func Rotate()
_GDIPlus_GraphicsClear($hGBackbuffer, 0xFF123456)
_GDIPlus_MatrixRotate($hMatrix, $RotAng)
_GDIPlus_GraphicsSetTransform($hGraphics, $hMatrix)
$aPathPoints2 = _GDIPlus_MatrixTransformPoints($hMatrix, $aPathPoints)
$aNewColors = _ChangeArrayColors($aColors, $aPathPoints2)
_GDIPlus_PathBrushSetSurroundColorsWithCount($hBrush, $aNewColors)
_GDIPlus_PathReset($hPath)
_GDIPlus_PathAddPolygon($hPath, $aPathPoints2)
_GDIPlus_GraphicsFillPolygon($hGBackbuffer, $aPoints, $hBrush)
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hGBitmap, -150, -150, 300, 300)
EndFunc ;==>Rotate
Func _ChangeArrayColors($Colors, $Points)
Local $y
Local $dif
Local $ColorDif
Local $NewColor
For $i = 1 To $Points[0][0]
$y = $Points[$i][1]
$dif = $y - 150
$ColorDif = $dif * 255 / 100 ; bastante toqueteado
$NewColor = ($ColorDif) * -1
If $NewColor > 255 Then
$NewColor = 255 ; quedo bastante random el algoritmo :S
EndIf
If $NewColor < 0 Then
$NewColor = 0
EndIf
$Colors[$i] = "0xFF"&Hex($NewColor, 2)&"5555"
Next
Return $Colors
EndFunc ;==>_ChangeArrayColors