Mouseout o su equivalente en AutoIt

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Mouseout o su equivalente en AutoIt

Mensaje 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!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Mouseout o su equivalente en AutoIt

Mensaje 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).
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Mouseout o su equivalente en AutoIt

Mensaje 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!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Mouseout o su equivalente en AutoIt

Mensaje 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.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Mouseout o su equivalente en AutoIt

Mensaje 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!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Mouseout o su equivalente en AutoIt

Mensaje 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!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Mouseout o su equivalente en AutoIt

Mensaje 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.
Adjuntos
Mis Funciones emular eventos.rar
(17.95 KiB) Descargado 185 veces
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Mouseout o su equivalente en AutoIt

Mensaje 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!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Mouseout o su equivalente en AutoIt

Mensaje 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...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Mouseout o su equivalente en AutoIt

Mensaje 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!
Responder