Página 1 de 1

Mouseout o su equivalente en AutoIt

Publicado: 11 Ago 2010, 20:56
por Jonny
Hola

Quiero hacer un menú como el de algunas páginas web, en los que al poner el ratón sobre una de las opciones, sin cliquear, se desplega un submenú...

He programado algo así en javascript, pero no se como hacerlo en AutoIt.

¿Sabeis como hacer esto en AutoIt?

¿Habrá algún estilo de GuiCtrlCreateButton() que ayude?, ¿O me tocará hacerlo todo a mano, comprobando coordenadas del ratón, etc etc?

La idea es: Hacer un menú con algunas opciones; Por ejemplo:
" - Empezar"
" - "Configuración"
" - Salir"
Entonces, al poner el cursor sobre "Empezar" (por ejemplo), se desplegaría un su´b menú:
" - Inicio rápido"
" - Inicio manual"
Si se pusiera el ratón sobre "Configuración" o "Salir" (sobre cualquier otra opción distinta a la que abrió el sub menú), se cerraría ese sub menú y se desplegaría el correspondiente a la opción "Configuración":
" - Red"
" - Estilo"
y así con todas las opciones (que tuvieran sub menús), por ejemplo "Salir" no tendría este mecanismo, pues no tendría sub menú, por lo que habría que pulsar en esa opción para ejecutar la acción asociada a esa opción.

Acias,

Salu2!

Re: Mouseout o su equivalente en AutoIt

Publicado: 12 Ago 2010, 09:10
por Ximorro
Puedes hacerlo un poco a mano con el evento de ratón $GUI_EVENT_MOUSEMOVE, cada vez que se active miras a ver en que coordenadas está, por no mirarlo cada vez puedes guardar en qué regiones están los controles para comprobar si las coordenadas actuales están dentro de alguna de esas regiones.

También se puede hacer con GUIGetCursorInfo, que te dice dónde está el ratón en una ventana, si se ha pulsado algún botón, y muy importante en este caso: sobre qué control está el ratón.

Probablemente la segunda opción sea mejor.

Otras maneras parecidas se pueden programar con ControlGetHandle (al identificar el control puedes hacerlo por coordenadas) o incluso con la API, con WindowFromPoint en user32.dll, que en este caso Window se refiere a algo genérico y también funciona con controles.

Mira si tienes posibilidades.

Además quizás los controles devuelvan notificaciones de movimiento de ratón en WM_COMMAND o WM_NOTIFY. Desgraciadamente he estado buscando sobre esto y no he encontrado esas notificaciones (quizás sean otros mensajes).

Re: Mouseout o su equivalente en AutoIt

Publicado: 12 Ago 2010, 16:26
por Jonny
Hola

¡Gracias!

Sí, creo que la mejor forma será con GuiGetCursorInfo.

He estado mirando la ayuda de la función, y dice:
Con Éxitos
devuelve un arreglo de 5 elementos conteniendo información del puntero del ratón:
...
...

$arreglo[4] = ID del control sobre el cual el puntero es movido (o 0 si no es el caso)
Entiendo, que se refiere, a que si no está el cursor sobre ningún control ese elemento del array valdrá "0" ¿Verdad?.

Además, en los comentarios de la función pone:
Los ID de controles ListViewItem o TreeViewItem nunca son devueltos, solamente de los controles Listview o TreeView.
¿quiere decir eso, que no devolverá el ID de un button, edit... etc?

Acias,

Salu2!

Re: Mouseout o su equivalente en AutoIt

Publicado: 13 Ago 2010, 09:05
por Ximorro
Sí, devuelve cero si no está en un control. La verdad es que eso se entiende mejor en inglés, allí pone (or 0 if none) "o 0 si no hay ninguno".

Por supuesto que devuelve el ID de botones, edits y demás, lo que está diciendo es que en un Listview o TreeView no devuelve la línea concreta sobre la que estás (el item) sino el ID del objeto lista o árbol padre.

Re: Mouseout o su equivalente en AutoIt

Publicado: 13 Ago 2010, 16:51
por Jonny
Ah, bien... en principio necesitaré los ID de controles sencillos, como buttons, labels... así que no hay problema.
Entonces, tocará hacerlo a mano, pero con suerte, de que no dará demasiado trabajo jejeje.

Acias.

Salu2!

Re: Mouseout o su equivalente en AutoIt

Publicado: 13 Ago 2010, 21:32
por Jonny
Hola

¿Esta función sirve solo para el puntero del ratón ¿Verdad??
¿Para que funcione con el foco del teclado debería hacerlo con ControlGetFocus()?

Salu2!

Re: Mouseout o su equivalente en AutoIt

Publicado: 15 Ago 2010, 00:13
por Chefito
Ya veo que habeis conseguido una buena solución :smt002 .
Igualmente os voy a adjuntar las primeras funciones que hice en AutoIt (un mes después de conocerlo las acabé :smt003 ). Aun no conocía el tema del tratamiento de eventos por parte de AutoIt y a causa de esto hice unas funciones que trataban estos eventos.

Dentro de estas funciones encontrareis emulación de eventos de entrada y salida del ratón sobre objetos, movimientos de ratón sobre objetos, entrada y salida del foco sobre la ventana y objetos, etc. En el código hay un pequeño ejemplo para ver las funcionalidades de estas funciones.
El enlace estaba aquí, pero se ha perdido el texto cuando ocurrió la perdida de la base de datos original del foro: http://www.emesn.com/autoitforum/viewfo ... &start=150 . Es el segundo post de la hoja. Como veis es muy antiguo, pero sigue funcionando (por fortuna :smt003 ).
Jonny escribió:¿Para que funcione con el foco del teclado debería hacerlo con ControlGetFocus()?
Como he dicho antes hay una función en mi ejemplo anterior que hace esto.
Aunque puedes tratar la genancia y perdida del foco de controles gracias a los eventos que recoge wm_command y wm_notify. Esta sería otra buena posibilidad.

Respecto al tema del menú, recuerda que AutoIt tiene una udf que trata los menús. Son las funciones que empiezan por _GUICtrlMenu_ ........ .
Otra idea sería insertar un control IE en la ventana e introducir el código dhtml del menú. Si necesitaras hacer transparente la página dejando solo el menú de ésta, podrías hacerlo haciendo transparente un color de fondo que tu le pusieses con la función _WinAPI_GetLayeredWindowAttributes.

Saludos.

Re: Mouseout o su equivalente en AutoIt

Publicado: 15 Ago 2010, 11:33
por Jonny
Hola

Muy buenas las funciones, gracias.

Las funciones "_GUICtrlMenu_" que dices son creo, para menús; Barras de menú etc ¿no? (no he tratado mucho con ellas). En cualquier caso, la idea era hacer un menú a base de botones, labels... Algo no estándar jeje, pero les hecharé un vistazo, a ver que hay.

Salu2!

Re: Mouseout o su equivalente en AutoIt

Publicado: 16 Ago 2010, 08:51
por Ximorro
Vaya currada. Pues nada Jonny, ahí tienes, precisamente Chefito mira eso de estar sobre un control en EventoSobreObjeto. Estúdiatela y recuerda poner los créditos a Chefito. :smt002
Probablemente la podrás simplificar, si sólo quieres saber cuándo entra, y no cuando sale. En ese caso también te será más rápido (creo) usar GUIGetCursorInfo, en vez de una combinación de ControlGetPos y MouseGetPos.

Y claro, siempre podrías usar menús normales, y cuando te vaya con eso haces los experimentos de hacer menús personalizados en los que haya que manejar los eventos a mano, por no complicar la cosa...

Re: Mouseout o su equivalente en AutoIt

Publicado: 18 Ago 2010, 18:15
por Jonny
Hola

En este post:
[ul]http://www.emesn.com/autoitforum/viewto ... f=4&t=2271[/ul]
He colgado una función que he hecho para detectar cuando el foco del ratón y del teclado está sobre un control.

Salu2!