Página 1 de 1

Programa para saber Coordenadas y Color decimal

Publicado: 06 Feb 2012, 19:06
por ziknos
Hola, estoy haciendo un programa para saber las coordenadas del puntero del ratón y del color decimal pero no consigo hacer lo segundo.

Tampoco consigo hacer que las coordenadas que me de sean del general de la pantalla y no de la Gui en si... aquí dejo el código a ver que es lo que tengo mal...

PD: Lo he sacado de la ayuda de auto it casi todo.

Código: Seleccionar todo

#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

Global $x, $y, $col

Ejemplo()

Func Ejemplo()
    Local $msg
    
    HotKeySet("{F2}", "GetPos")

    GUICreate("Presione Esc para obtener posición", 150, 150)
    $x = GUICtrlCreateLabel("0", 10, 10, 50)
    $y = GUICtrlCreateLabel("0", 10, 30, 50)
	$col = GUICtrlcreatelabel("00000", 10, 50, 50)
    GUISetState()

    ; ejecuta la GUI hasta que es cerrada
    Do
        $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE
EndFunc   ;==>Ejemplo

Func GetPos()
    Local $a
    $a = GUIGetCursorInfo()
	
    GUICtrlSetData($x, $a[0])
    GUICtrlSetData($y, $a[1])
	
EndFunc   ;==>GetPos

Func PixelColor()
	Local $b
	$b = PixelGetColor ()
	
	GUICtrlSetData ($col, $b)
	
	EndFunc
PD: Cuando este finalizado lo posteare un poco más arreglado por si a alguien le interesa, que para usar la opción pixelgetcolor va muy bien tener algo así a mano.

Re: Programa para saber Coordenadas y Color decimal

Publicado: 06 Feb 2012, 21:41
por ziknos
He cambiado algo, ahora consigo con mousegetpos lo de las coordenadas, me falta el pixelgetcolor

Código: Seleccionar todo

#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

Global $x, $y, $col, $a, $pgc

Ejemplo()

Func Ejemplo()
    Local $msg, $pgc
    
    HotKeySet("{F2}", "GetPos")

    GUICreate("Presione Esc para obtener posición", 150, 150)
    $x = GUICtrlCreateLabel("0", 10, 10, 50)
    $y = GUICtrlCreateLabel("0", 10, 30, 50)
	$pgc = GUICtrlcreatelabel("00000", 10, 50, 50)
    GUISetState()

    ; ejecuta la GUI hasta que es cerrada
    Do
        $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE
EndFunc   ;==>Ejemplo

Func GetPos()
    Local $a
    $a = MouseGetPos()
	
    GUICtrlSetData($x, $a[0])
    GUICtrlSetData($y, $a[1])
	
EndFunc   ;==>GetPos

Func Color ()
Local $pgc, $a

$pgc = Pixelgetcolor($a[0], $a[1])
Guictrlsetdata ($a, $pgc)

EndFunc

Re: Programa para saber Coordenadas y Color decimal

Publicado: 06 Feb 2012, 21:52
por ziknos
Edito de nuevo, perdón por repetir tantos post seguidos... ya lo tengo casi... ahora he conseguido todo a falta de que el pixelgetcolor me muestre el color de donde tengo el ratón en ese momento y no de donde está puesto

Código: Seleccionar todo

#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

Global $x, $y, $col, $a, $pgc, $b

Ejemplo()

Func Ejemplo()
    Local $msg
    
    HotKeySet("{F2}", "GetPos")
	Hotkeyset ("{F3}", "color")

    GUICreate("Presione Esc para obtener posición", 150, 150)
    $x = GUICtrlCreateLabel("0", 10, 10, 50)
    $y = GUICtrlCreateLabel("0", 10, 30, 50)
	$pgc = GUICtrlcreatelabel("00000", 10, 50, 50)
    GUISetState()

    ; ejecuta la GUI hasta que es cerrada
    Do
        $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE
EndFunc   ;==>Ejemplo

Func GetPos()
    Local $a
    $a = MouseGetPos()
	
    GUICtrlSetData($x, $a[0])
    GUICtrlSetData($y, $a[1])
	
EndFunc   ;==>GetPos

Func Color ()
Local $b

$b = Pixelgetcolor(1555, 451)
Guictrlsetdata ($pgc, $b)


EndFunc

Re: Programa para saber Coordenadas y Color decimal

Publicado: 06 Feb 2012, 21:59
por ziknos
Oleee conseguido!!! ahora lo hago un poco más bonito y lo subo! :D borrar el post entero si queréis

Re: Programa para saber Coordenadas y Color decimal

Publicado: 06 Feb 2012, 23:16
por arkcrew
Jajajaja, bueno yo por mi parte no lo borraría, se ha vito claramente como te has esforzado y al final tu mismo lo has conseguido, y, además así por si alguien lo quiere aqui queda..

Saludos!

Re: Programa para saber Coordenadas y Color decimal

Publicado: 06 Feb 2012, 23:20
por ziknos
Para finalizar, me falta poder escribir en un .txt la posición x, y, el color y el texto que yo quiera, esto sería para tener guardado cada vez que le de a un botón o a la tecla F3.

Código: Seleccionar todo

#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

Global $x, $y, $col, $a, $b, $text, $save, $text, $file, $msj

$file = FileOpen("CoordenadasYcolores.txt", 1)

Ejemplo()

Func Ejemplo ()
	Local $msg
    
    HotKeySet("{F2}", "poscolor")
	HotkeySet ("{F3}", "guardar")

    GUICreate(" F2 ", 150, 150)
	GUICtrlCreateLabel("x ", 21, 10, 50)
	GUICtrlCreateLabel("y ", 21, 30, 50)
	GUICtrlCreateLabel ("Color ", 21, 50, 50)
    $x = GUICtrlCreateLabel("0", 50, 10, 50)
    $y = GUICtrlCreateLabel("0", 50, 30, 50)
	$col = GUICtrlcreatelabel("0", 50, 50, 50)
	$text = GUICtrlCreateInput("Texto", 21, 75, 94, 20) 
	$save = Guictrlcreatebutton("Guardar", 40, 110, 70, 20)
    GUISetState()

    ; ejecuta la GUI hasta que es cerrada
    Do
        $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE
EndFunc   ;==>Ejemplo

Func poscolor()
    Local $a, $b
    $a = MouseGetPos()
	$b = PixelGetColor ($a[0], $a[1])
	
    GUICtrlSetData($x, $a[0])
    GUICtrlSetData($y, $a[1])
	Guictrlsetdata ($col, $b)
	
	
EndFunc 

Func guardar ()
	
	while 1
        $msj = GUIGetMsg()
        Select
            Case $msj = $save
			 FileWrite($file, $a & @LF)
			 FileWrite($file, "   " & @LF)
			 FileWrite($file, $y & @LF)
			 FileWrite($file, "   " & @LF)
			 FileWrite($file, $b & @LF)
			 FileWrite($file, "   " & @LF)
			 FileWrite($file, $text & @LF)
        EndSelect
wend
EndFunc
Me podéis ayudar a lo que me falta con el FileWrite?

Gracias

Re: Programa para saber Coordenadas y Color decimal

Publicado: 07 Feb 2012, 00:24
por BasicOs
Hola de la ayuda:

Código: Seleccionar todo

$file = FileOpen("test.txt", 1)

; Check if file opened for writing OK
If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

FileWrite($file, "Line1")
FileWrite($file, "Still Line1" & @CRLF)
FileWrite($file, "Line2")

FileClose($file)
O bien si creas un array:

Código: Seleccionar todo

#include<File.au3>

$avCommon = _FileListToArray(@CommonFilesDir)
$avUser = _FileListToArray(@UserProfileDir)
$sFile = @ScriptDir & "\Test.txt"

; Write first array to file by string file name
_FileWriteFromArray($sFile, $avCommon, 1)

; Open file and append second array
$hFile = FileOpen($sFile, 1) ; 1 = append
_FileWriteFromArray($hFile, $avUser, 1)
FileClose($hFile)

; Display results
Run("notepad.exe " & $sFile)

Aunque te recomendaria también IniWrite, aunque su uso no es para eso, te guarda los datos igual con:

Código: Seleccionar todo

IniWrite("C:\Temp\mifichero.ini", "seccion2", "clave", "valor nuevo")
Salu22:)

Re: Programa para saber Coordenadas y Color decimal

Publicado: 07 Feb 2012, 00:47
por ziknos
Hola Basicos, la ayuda me la he leído varias veces y he conseguido aplicar algo parecido a alguna otra aplicación pero a esta no se qué pasa que no lo consigo... algo tengo que hacer mal pero no se qué puñetas puede ser...

he añadido esto :

Código: Seleccionar todo

Func guardar ()

Local $text

        FileWrite ($file, "comentario      " )
	FileWrite ($file, $text & @CRLF )

	FileClose($file)
EndFunc
Hay 2 problemas.. 1º que solo puedo darle 1 vez a F3 y si le vuelvo a dar no sucede nada y 2º que la variable $text no se muestra :S

Respecto a lo que me comentas de array o writeini, nunca lo he usado y no tengo mucha idea para que me sirve

Re: Programa para saber Coordenadas y Color decimal

Publicado: 07 Feb 2012, 01:12
por ziknos
Me sucede una cosa MUY rara este es el código que tengo ahora

Código: Seleccionar todo

#include <GUIConstantsEx.au3>


Opt('MustDeclareVars', 1)

Global $x, $y, $col, $a, $b, $text, $save, $text, $file, $msj

$file = FileOpen("CoordenadasYcolores.txt", 1)

Ejemplo()

Func Ejemplo ()
	Local $msg
    
    HotKeySet("{F2}", "poscolor")
	HotkeySet ("{F3}", "guardar")

    GUICreate(" F2 ", 150, 150)
	GUICtrlCreateLabel("x ", 21, 10, 50)
	GUICtrlCreateLabel("y ", 21, 30, 50)
	GUICtrlCreateLabel ("Color ", 21, 50, 50)
    $x = GUICtrlCreateLabel("0", 50, 10, 50)
    $y = GUICtrlCreateLabel("0", 50, 30, 50)
	$col = GUICtrlcreatelabel("0", 50, 50, 50)
	$text = GUICtrlCreateInput("Texto", 21, 75, 94, 20) 
	$save = Guictrlcreatebutton("Guardar", 40, 110, 70, 20)
    GUISetState()

    ; ejecuta la GUI hasta que es cerrada
   While 1
	  $msg = GUIGetMsg()
	  Select
	  case $msg = $GUI_EVENT_CLOSE
		  FileClose($file)
		  ExitLoop
	  case $msg = $save
		FileWrite ($file, "comentario      " )
   FileWrite ($file, $x & @CRLF )
   continueloop


EndSelect
WEnd

EndFunc   ;==>Ejemplo

Func poscolor()
    Local $a, $b
    $a = MouseGetPos()
	$b = PixelGetColor ($a[0], $a[1])
	
    GUICtrlSetData($x, $a[0])
    GUICtrlSetData($y, $a[1])
	Guictrlsetdata ($col, $b)
	
	
EndFunc 


Ahora cuando pulso el boton "guardar" me sale en el .txt Comentario 6 no se de donde puede salirme dicho 6.

Re: Programa para saber Coordenadas y Color decimal

Publicado: 07 Feb 2012, 02:24
por BasicOs
Los ficheros que se crean con las funciones ini son parecidos al .txt que creas pero más ordenado, y ves que con solo una linea puedo añadir texto a un fichero.

6 es el valor de x$ que es el controlID del control.

Si quieres leer valores usa GUICtrlRead ( controlID [, advanced] ).

Te recomiendo que uses ejemplos parecidos del foro para lo que quieres y los modifiques, hasta que domines el GUI, realmente vas bien,

Salu22:)

Re: Programa para saber Coordenadas y Color decimal

Publicado: 07 Feb 2012, 09:46
por Ximorro
Anda si tenías una entrada con lo del color del pixel. Te había contestado en la otra pero veo que lo tienes muy avanzado y que te lo estás currando mogollón. ¡Muy bien! :smt023

Efectivamente como te indica BasicOS estás sacando el valor del control (su identificador) y no el texto que contiene, que es lo que en realidad quieres guardar.
Así que ese write tiene que ser:
FileWrite($file, GUICtrlRead($x) & @CRLF )

Una cosa, el ContinueLoop te sobra en este caso, eso es para interrumpir un ciclo de un bucle y volver al principio del mismo, pero en este caso simplemente hay que seguir el flujo del programa.
Una cosa por si te estás confundiendo por el C u otros lenguajes: en AutoIT los Switch o Select cuando ejecutan un case no pasan al siguiente como hace C (donde hay que poner un break, que sí, sería el equivalente de ContinueLoop, pero aquí no hace falta porque AutoIt no ejecuta el siguiente case, sólo el que cumple la condición).

Re: Programa para saber Coordenadas y Color decimal

Publicado: 07 Feb 2012, 12:06
por ziknos
Muchísimas gracias!!! ya lo he finalizado!! Adjunto el código completo por si alguien le interesa

Código: Seleccionar todo

#include <GUIConstantsEx.au3>


Opt('MustDeclareVars', 1)

Global $x, $y, $col, $a, $b, $text, $save, $text, $file, $msj

$file = FileOpen("CoordenadasYcolores.txt", 1)
Filewrite ($file, " X       Y       COLOR    COMENTARIO  " &  @CRLF)
Filewrite ($file, "                                      " &  @CRLF)


Ejemplo()

Func Ejemplo ()
	Local $msg
    
    HotKeySet("{F2}", "poscolor")
	HotkeySet ("{F3}", "guardar")

    GUICreate(" CoordCol ", 150, 150)
	GUICtrlCreateLabel("x ", 21, 10, 50)
	GUICtrlCreateLabel("y ", 21, 30, 50)
	GUICtrlCreateLabel ("Color ", 21, 50, 50)
    $x = GUICtrlCreateLabel("0", 50, 10, 50)
    $y = GUICtrlCreateLabel("0", 50, 30, 50)
	$col = GUICtrlcreatelabel("0", 50, 50, 50)
	$text = GUICtrlCreateInput("", 21, 75, 94, 20) 
	Guictrlcreatelabel("F2 = Cordenadas y color", 5, 100, 120, 20)
	Guictrlcreatelabel("F3 = Guardar", 5, 120, 120, 20)
    GUISetState()

    ; ejecuta la GUI hasta que es cerrada
 While 1
	  Local $x, $y, $col, $text
	  
	 $msg = GUIGetMsg()
	  Select
	  case $msg = $GUI_EVENT_CLOSE
		  ExitLoop
EndSelect
WEnd

EndFunc   ;==>Ejemplo

Func poscolor()
    Local $a, $b
    $a = MouseGetPos()
	$b = PixelGetColor ($a[0], $a[1])
	
    GUICtrlSetData($x, $a[0])
    GUICtrlSetData($y, $a[1])
	Guictrlsetdata ($col, $b)
	
EndFunc 

Func guardar ()
	
FileWrite ($file, Guictrlread($x))
		FileWrite ($file, "    ")
	FileWrite ($file, Guictrlread($y))
		FileWrite ($file, "    ")
	FileWrite ($file, Guictrlread($col))
		FileWrite ($file, "    ")
   FileWrite ($file, Guictrlread($text) & @CRLF )
   
   endfunc
USO:
- F2 Nos muestra las coordenadas y el color decimal de el puntero del ratón
- F3 Guarda los datos de las coordenadas, el color y el comentario que queramos darle a dicha posición

Por qué lo he echo?

Para comodidad al usar el autoit y simular clicks de ratón o tener los datos a mano para hacer pixelgetcolor, etc...

Re: Programa para saber Coordenadas y Color decimal

Publicado: 07 Feb 2012, 14:29
por BasicOs
El au3info del scite te hace algo parecido, pero no hay nada como hacerlo uno mismo y disfrutar tanto al hacerlo como al usarlo. ;)

Salu22:)

Re: Programa para saber Coordenadas y Color decimal

Publicado: 07 Feb 2012, 14:44
por ziknos
BasicOs escribió:El au3info del scite te hace algo parecido, pero no hay nada como hacerlo uno mismo y disfrutar tanto al hacerlo como al usarlo. ;)

Salu22:)
Sí, el au3info da casi lo mismo pero el color no me lo daba en decimal que es lo que yo buscaba, o eso creo!! :smt003

Re: Programa para saber Coordenadas y Color decimal

Publicado: 08 Feb 2012, 09:46
por Ximorro
Es fácil pasar de decimal a hexadecimal y viceversa. El formato dependerá de para qué lo uses.
En Autoit es equivalente usar el número decimal o hexadecimal, se usa más el hexadecimal porque a simple vista te haces una idea de los valores individuales para rojo, verde y azul. En decimal eso es imposible.

En otros programas pues dependerá si te exige un formato u otro...

Re: Programa para saber Coordenadas y Color decimal

Publicado: 09 Feb 2012, 15:48
por ziknos
Pues yo he usado siempre el decimal para el autoit, para usar el pixelgetcolor, como por defecto es decimal (sin poner Hex) me era mas comodo poner el color decimal y me ahorro lo de Hex cada 2 por 3, por que en casi todo lo que hago uso mucho el pixelgetcolor

Re: Programa para saber Coordenadas y Color decimal

Publicado: 10 Feb 2012, 09:39
por Ximorro
En el código no tienes que usar Hex() para pasar a hexadecimal. Esa función es más bien para ti, para que dado un número decimal te muestre una cadena de texto con su representación hexadecimal.

Pero si ya sabes el número a AutoIt se lo pasas directamente poniendo delante 0x.
Por ejemplo. Si quiero poner un blanco puro pondré
0xFFFFFF
es decir, el máximo valor 255 (FF en hexadecimal) para las tres componentes rojo, verde y azul.
y eso lo hago directamente, para ponerlo en decimal tengo que poner
16777215
para blanco, ¿quieres decir que te sabes el número de memoria?

Si quiero poner por ejemplo un rojo puro pues será
0xFF0000
simplemente he puesto el rojo a FF y los otros a cero, no hay que pensar mucho y lo puedo hacer directamente, pero para ponerlo en decimal es:
16711680
¿cómo veo ahí que eso es rojo?

Por eso se usa el formato hexadecimal para los colores, es mucho más intuitivo. A veces no sabes qué color exacto sale pero te puedes hacer una idea, no sé, por ejemplo
0x80FF00
no sé exactamente qué saldrá pero veo que tiene mitad de rojo, mucho de verde y nada de azul, así que será un verde con algo de amarillo (rojo+verde = amarillo)
En cambio si me dicen que tengo el color
8453888
¡no tengo ni puñetera idea de qué puede ser!

Espero haber aclarado algo. Hex es una función para que te muestre un número decimal en un texto que es su representación hexadecimal.
Pero para usar números hexadecimales se pueden usar directamente, simplemente poniendo 0x antes del número para que AutoIt sepa que eso es hexadecimal. Y se pone SIN comillas, que no es un texto, es un número.

Re: Programa para saber Coordenadas y Color decimal

Publicado: 12 Feb 2012, 16:51
por ziknos
Hola, muchas gracias, con esa explicación sí que me queda más claro del porqué usar hexadecimal en vez de de decimal.. aunque para lo que yo lo uso sería lo mismo por que sólo (de momento) lo utilizo para el pixelgetcolor con colores sacados con programas para saber el color de X pixel.

Un saludo y gracias!