Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Evento Va, Evento Viene...

Iniciado por BeRSeRKeR, 27 de Noviembre de 2003, 12:34:24 AM

« anterior - próximo »

BeRSeRKeR

 Hola chavalines/chavalinas.

Resulta que estoy empezando a crearme una librería de controles personalizados, es decir, botones, menús, checkboxes y demás controles de windows con un look diferente. O bueno, más bien algo parecido al XP pero que se pueda ver igual en todos los Windows. Para ello estoy utilizando C# ya que me parece un lenguaje sencillo y muy parecido a Java con el cual estuve desarrollando algunas cosillas durante algo más de un año y la verdad, me gustó bastante. Pero bueno, esto no viene al caso :)

A ver. Imaginad que tengo un cuadro de diálogo y un botón dentro de ese cuadro de diálogo. Ahora pulso el boton izquierdo del ratón en cualquier parte del diálogo que no sea el botón y sin soltar el botón del ratón, lo arrastro hasta entrar en el botón.

Pues bien, en XP si haces eso, cuando el cursor entra en el botón, éste cambia de estado (concretamente se selecciona) pero yo he estado probando y probando y a mi el botón no me lanza ningún evento. Ni OnMouseMove, ni OnMouseEnter....nada. Sólo me lo lanza una vez que he soltado el botón izquierdo del ratón.

Así que lo que quería saber es si hay que tener algo más en cuenta, si tengo que mirar otro evento, o que...

Ale, gracias por leerme :)

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

NeLo

 Cuando tienes pulsado el ratón y entras en un botón, ¿éste se selecciona?

No aprecio que ocurra eso :huh:

Simplemente, no pasada nada.

¿En qué ventana has probado eso?

Saludos.
Drowning deep in my sea of loathing

BeRSeRKeR

 Hola Neo, digo NeLo :D

Pues en el XP, con la combinación de colores "Plateado" (no sé si en las demás también), en cualquier ventana con botones ala XP, los botones se seleccionan al pasar el cursor por encima. Concretamente aparece un recuadro naranja.

Pues eso es lo que estoy intentando hacer, capturar el mensaje que me diga que el ratón ha entrado en el botón para poder pintar algo que sobresalte el botón. Pero cuando se está haciendo click es como si el sistema bloqueara el lanzamiento de eventos de forma que el botón ni se entera.

Y es extraño porque he probado a capturar los mensajes del botón (no el de mi aplicación; que no me lo detecta como control, sino uno cualquiera de Windows) con el Spy++ y efectivamente, captura el mensaje WM_MOUSEMOVE pero a mi no me lo captura en mi aplicación :D

No es que sea algo importante el hecho de plasmar en pantalla el estado "activado" del botón, pero mola... :)

Por cierto, el hecho de que el Spy++ no me detecte mi botón como un control de windows no debería ser el motivo ya que he probado a meter un botón estándar de windows en el formulario y he puesto un manejador para el evento OnMouseMove y nada, el botón tampoco me lanza nada.

See ya!.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

 Rectifico, acabo de probar otra vez con el Spy++ y sí me lo detecta como control pero no me lanza ni un sólo evento cuando mantengo pulsado el botón izquierdo del ratón.

También he probado como he dicho antes a poner un botón de toda la vida y tampoco me lo lanza, en cambio en otras ventanas de otros programas si...¿será alguna propiedad del formulario? :D

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

NeLo

 Cuando pulsas un botón del ratón en el formulario, Windows espera que lo sueltes, y el control activo es el formulario, con lo cual el botón ya no pinta nada, y no lanzará el mensage de que el ratón está sobre él.

¿Te refieres a eso?

Cuando no pulsas el botón del ratón, el botón detecta cuando el puntero está sobre él. Pero si clickas y arrastras, no detecta cuando pasa por encima del ratón.

O es una propiedad del formulario, o te toca comprobar la posición del ratón en cada WM_MOUSEMOVE.

Yo no uso skins de XP, y cuando paso por encima de un botón con el botón del ratón pulsado, no selecciona el botón ni nada de nada. Así que seguramente sea una propiedad.

Saludos.
Drowning deep in my sea of loathing

CoLSoN2

 hombre, si es cuando pasa el raton por encima sera un onmouseover o algo asi no?
sino, si "se selecciona",como cuando haces tab, recuerdo que en c++ builder , no se si ahi tb, habia una variable del panel o no macuerdo de donde que te decia que control tenia el foco, osea que si le dabas al enter cual se activaba, algo asi..
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

BeRSeRKeR

 
Cita de: "NeLo"...o te toca comprobar la posición del ratón en cada WM_MOUSEMOVE.
Supongo que podría comprobar en el OnMouseMove del formulario si el cursor está dentro del área del botón y si es así, mandarle a éste el evento OnMouseEnter pero la verdad no creo que eso sea lo que hace Windows con los botones. Lo que yo quiero es que eso sea algo inherente al botón y no al formulario.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

NeLo

 ¿Y como crees que lo hace Windows en el fondo?

No hay manera humana de saber cuando el ratón esta encima de algo, si no es comprobando coordenadas.

Pero ya te digo, que no sé si hay una propiedad por ahí que tenga algo que ver...

Saludos.
Drowning deep in my sea of loathing

NeLo

 Pero, ¿seguro que cuando tienes el botón pulsado no lanza eventos WM_MOUSEMOVE?

Si no recuerdo mal, cuando controlabas el evento OnMouseMove, podías ver si un botón del ratón estaba pulsado o no, pero si cuando se pulsa un botón no se lanza WM_MOUSEMOVE, no tiene sentido...


Saludos.
Drowning deep in my sea of loathing

NeLo

 ¿Acaso sí que lanza el mensage WM_MOUSEMOVE cuando te mueves dentro de la ventana donde has pulsado el botón, pero no cuando entras en otra área cliente (control)?

Saludos.
Drowning deep in my sea of loathing

BeRSeRKeR

Cita de: "NeLo"¿Acaso sí que lanza el mensage WM_MOUSEMOVE cuando te mueves dentro de la ventana donde has pulsado el botón, pero no cuando entras en otra área cliente (control)?
Ese es el caso del que hablo. Pulso en el formulario y arrastro. Mientras estoy en el formulario, el evento se sigue lanzando desde el formulario pero cuando entro en el botón, éste no lanza ningún evento, aunque el formulario sigue lanzando su evento WM_MOUSEMOVE.

Sin ir más lejos, en el cuadro de diálogo "Ejecutar" (del menú Inicio), si capturo los mensajes del botón "Aceptar" con el Spy++, cuando hago la prueba de la que hablo, el botón efectivamente lanza el mensaje WM_MOUSEMOVE. También me lanza el evento WM_MOUSEMOVE el botón Aceptar/Cancelar de los "MessageBox". Pero otros como es el caso de mi formulario, no me lo lanza :D

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

NeLo

 Pues entonces no hay otra, debe ser una propiedad, alguna variable al inicializar el control, o algo así...

¿Pero cual? :D

Saludos.
Drowning deep in my sea of loathing

fiero

 Podrias usar el mensaje WM_SETCURSOR para saber sobre qué elemento se encuentra el ratón.
De todas formas, al pulsar sobre el botón y mantener pulsado moviendo, solo se envian mensajes WM_MOUSEMOVE (unicamente al botón). La forma que se me ocurre para detectar el mensaje WM_MOUSEMOVE siempre, es hacerlo desde "dentro" del botón, o sea, hacer una clase derivada de CButton (hablando en MFC) y sobreescribir en la nueva clase la función OnMouseMove. Después haces que tus botones sean de tu clase, en vez de CButton

un saludo
www.videopanoramas.com Videopanoramas 3D player

BeRSeRKeR

 Si, si eso es lo que estoy haciendo derivo mi clase botón de la clase base de botón de .NET y todo va bien, excepto en el caso del que hablo de pinchar fuera del botón y sin soltar, mover el ratón y pasar por encima del botón. En ese momento en el que el cursor pasa por encima del botón, el botón no produce ni un sólo evento.

En cambio en otros casos que he mencionado antes, como puedan ser los cuadros de mensaje (MessageBox), en el caso que menciono, según el Spy++, el botón sí que produce eventos. Y de hecho tiene que producirlos porque de otra forma el botón no sabría ponerse en estado "hover", o sea seleccionado.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Haddd

 ¿no tendrás un SetCapture en el evento OnMouseClick?






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.