Eventos sobre un grafico GDI+

y programas personales para otros como tu, puede que te corrijan ;)
Avatar de Usuario
ms999
Hacker del Foro
Mensajes: 116
Registrado: 26 Ene 2011, 06:13

Eventos sobre un grafico GDI+

Mensaje por ms999 »

Bueno he hecho un par de cositas estos dias y he llegado a una meseta con esta idea de trabajar con GUIs personalizadas, uno de los logros que he hecho es lograr captar eventos del mouse sobre graficos--- no sobre un controlPic ni nada, sobre el grafico mismo.. esto fue posible gracias a una función que permite captar si tal punto pertenece a un grafico, bastante sencillo al final, pero todabia no he visto algo parecido.

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

Responder