Título: Terminar evento MouseDown con el botón del ratón pulsado Publicado por: Lekim en 12 Junio 2016, 17:24 pm He cambiado el título de la pregunta porque no estaba bien hecha, ya que hacía referencia al foco de objeto cuando en realidad me refiero al evento. Cuando se presiona sobre el objeto éste recibe el foco, por eso usé esa palabra. Realmente lo que necesito es terminar o salir del evento MouseDown y volver a entrar sin soltar el botón del ratón al salir y entrar en otro objeto de un mismo array Hola Estoy intentado que al pulsar un objeto sea un Label, picture o botón, al salir de él éste salga del evento de pulsado (Mousedown) del objeto y al entras seguidamente en otro objeto éste reciba el enfoque y el evento MouseDown Para que se me entienda. Imagina el teclado del ordenador y pasas y pulsas A el botón baja, luego deslizas el dedo manteniendo pulsado y pasa a S. el botón S bajará y el A subirá. En un editor de texto se escribiría AS sin haber levantado el dedo. Necesito eso mismo pero con controles. pero no se como hacerlo. He probado con Hover y Enter, pero no me sale. Parece una tontaría y muy simple pero llevo rato inentandolo y nada Gracias Aquí dejo lo que he hecho. Al pulsar sobre el Label(2) éste cambia de color al azul y sin soltar, al salir de él y entrar en Label(1), pierde su color azul, pero el Label(1) no cambia de color porque todavía está en el evento MousDown Label(2). Necesito que al entrar en Label(1) entre en el evento Mousdown de este control y salga del MouseDown del Label(2). Código
Título: Re: Quitar enfoque al salir de un objeto y en MouseDown Publicado por: DarK_FirefoX en 12 Junio 2016, 18:51 pm Con respecto a tu analogía con el teclado habría que ver como funciona un controlador de teclado, no se mucho sobre controladores, y no se si de alguna forma a muy bajo nivel utilice threads (que es como se me ocurre a priori) (también voy a probar con eventos). Me explico:
Hice la prueba que dices con el teclado, presione la A (y la deje apretada, por ende en el editor de texto, se repite la AAAAAAA.....) luego, presione la S (da lo mismo con que dedo) con otro dedo, y se escribio la S (SSSSSSSSSSSSSSS.....), si ahora, en efecto se "paso" de un lugar a otro el "foco" de una tecla a otra, pero si suelto la tecla S no vuelve a pasar a la tecla A, y lo probé recursivamente con varias teclas en profundidad y sucede lo mismo. De cualquier manera voy a hacer mis pruebas y luego te digo, si aparece alguien que sepa como hacerlo o tenga alguna idea, la espero igual que tu. Salu2s Título: Re: Quitar enfoque al salir de un objeto y en MouseDown Publicado por: Lekim en 12 Junio 2016, 18:58 pm Con respecto a tu analogía con el teclado habría que ver como funciona un controlador de teclado, no se mucho sobre controladores, y no se si de alguna forma a muy bajo nivel utilice threads (que es como se me ocurre a priori) (también voy a probar con eventos). Me explico: Hice la prueba que dices con el teclado, presione la A (y la deje apretada, por ende en el editor de texto, se repite la AAAAAAA.....) luego, presione la S (da lo mismo con que dedo) con otro dedo, y se escribio la S (SSSSSSSSSSSSSSS.....), si ahora, en efecto se "paso" de un lugar a otro el "foco" de una tecla a otra, pero si suelto la tecla S no vuelve a pasar a la tecla A, y lo probé recursivamente con varias teclas en profundidad y sucede lo mismo. De cualquier manera voy a hacer mis pruebas y luego te digo, si aparece alguien que sepa como hacerlo o tenga alguna idea, la espero igual que tu. Salu2s Si eso también lo quiero que mientras esté pulsado se mantenga la orden. Usando como ejemplo lo del teclado si mantengo pulsado A sale "AAAAAA..." y sin soltar el dedo deslizo hacia S y mantengo pulsado pone "SSSSSSSSSSSSSSS" y si suelto deja de escribir. Pues eso pero con controles y en lugar del dedo el ratón. Me estoy acercando... :xD He conseguido hacerlo pero solo funciona cuando mueves a la izquierda pero no a la derecha, usando API. Código
¡¡CONSEGUIDO!! Pulsa con el botón derecho del ratón sobre una banda y luego desliza sin soltar el botón, las bandas(que son Labels), se activarán al pasar el puntero. (https://2.bp.blogspot.com/-3Hatlntdr-w/V156qjjFOcI/AAAAAAAAAYs/oZxHVq2rw4UHEnwDHBlRK3EoQ7ATEw9jgCLcB/s1600/imgMouseDownClick.gif) Código
¿Realmente no hay forma de hacerlo usando puro NET? He entrado en otro foro y no he recibido más que críticas por haber usado el API, pero ninguna solución. :¬¬ Título: Re: Quitar enfoque al salir de un objeto y en MouseDown Publicado por: DarK_FirefoX en 14 Junio 2016, 02:10 am Me hubiera gustado también hacerlo sin "código no manejado", realmente llevo varios días ocupado y no he tenido tiempo de intentarlo! Parece que @Eleкtro también ha estado ocupado, de seguro hubiéramos visto una respuesta de el.
En cuanto tenga un chance voy a probar! Salu2s Título: Re: Quitar enfoque al salir de un objeto y en MouseDown Publicado por: Lekim en 14 Junio 2016, 10:01 am Me hubiera gustado también hacerlo sin "código no manejado", realmente llevo varios días ocupado y no he tenido tiempo de intentarlo! Parece que @Eleкtro también ha estado ocupado, de seguro hubiéramos visto una respuesta de el. En cuanto tenga un chance voy a probar! Salu2s Gracias De seguro que @Eleкtro sabría hacerlo, y lo que hiciera no se si lo entendería pero mientras funcioné chapó. He estado probando con System.Windows.Forms.MouseEventArgs y Sender, creo que por ahí van los tiros pero sin éxito. Lo que quiero hacer no es algo que la gente demande y se encuentre buscando en google. Hay que tirar de ingenio. s2s Título: Re: Terminar evento MouseDown con el botón del ratón pulsado Publicado por: Eleкtro en 14 Junio 2016, 22:31 pm Gracias De seguro que @Eleкtro sabría hacerlo, y lo que hiciera no se si lo entendería pero mientras funcioné chapó. He estado probando con System.Windows.Forms.MouseEventArgs y Sender, creo que por ahí van los tiros pero sin éxito. Lo que quiero hacer no es algo que la gente demande y se encuentre buscando en google. Hay que tirar de ingenio. s2s Hola Lekim No es que yo esté ocupado, es que me conecto poquísimo al foro estos días, de hecho no habia visto tu post hasta ahora. No he revisado tu solución, pero he leido los mensajes y el contenido de forma superficial, y te puedo asegurar que no es necesario recurrir al código no administrado, todo lo que necesitas para intercambiar el foco de los controles pulsando A/S (o izquierda/derecha) es lo sigueinte: 1. Asignar un índice de tabulación correlativo a cada control. ( Menú View -> Tab Order ) 2. Utilizar la función Control.SelectNextControl() (sobre todo hacer un uso adecuado del primer parámetro, el cual indica si debe elegir el control siguiente o el anterior.) 3. Controlar las teclas que desses, por supuesto, en este caso "A" y "S". Es fácil, no creo que necesites ayuda, ya que siempre puedes informarte en la MSDN (o mediante IntelliSense) sobre el propósito de los parámetros de la función mencioanda. -------------------------------------------------- Si además de eso también quieres poder elegir controles de una forma "vertical" entonces ya es más tedioso, puesto que una colección de controles no entiende de posiciones verticales u horizontales, sino de indices. Cómo he dicho es tedioso, pero no imposible. Siempre puedes buscar el control más proximo hacia abajo o hacia arriba (y también de forma horizontal, reemplazando a la metodología del tabstop) mediante punteros del mouse, es decir, incrementando o disminuyendo la posición vertical (Point.Y), y haciendo uso de la función Control.GetChildAtPoint() con dicho puntero, pero te advierto esa metodología no te servirá para controles que estén superpuestos o dentro de una sub-colección de controles (ej. un Panel), así que te recomiendo utilizar mi función: Código
Ejemplo de uso: Código
PD: Llevo un rato preparando una respuesta con un código bastante largo para otra persona, así que por el momento no examinaré tu solución, pero si hay algo que no haya entendido bien dímelo, si o necesitas más ayuda, pídelo. EDITO: Algunos overloads de mi función: http://pastebin.com/Sb90A5nP Saludos! Título: Re: Terminar evento MouseDown con el botón del ratón pulsado Publicado por: Lekim en 16 Junio 2016, 01:13 am Hola
Bueno, pues ya lo he hecho y sin código no administrado. Ahora saldrá el listo que dirá, pero si es muy fácil no hace falta hacer tanta historia... Cuando he preguntado y nadie me resolvía la papeleta. Incluso en otro foro (en inglés) un usuario me ha puesto de los nervios porque no hacía más que decirme que era muy fácil, que usara MouseEnter, MouseLeave. Yo le dije que estos eventos no fucionan cuando arrastras el puntero con el bóton del ratón presionado, que no devuelven el índice del control donde se encuentra el puntero. De nuevo me contesta - ten encuenta el OOP, bla, bla, bla...-, jolines si es tan fácil teclea un poco y lo pones maldito hijo de la gran.... Igual se penseava que es sólo el clic. Pero si es que hasta le puse imágenes de demostración. Total que está hecho. No fuerzo la cancelación del evento, como hacía con Mouse_Event que era una alternativa para hacer lo que quería. Lo he hecho usando lógica matemática, mediante un algoritmo obtengo el índice del Label en el que se encuentra el cursor, estando el botón pulsado y arrastrandose a través del array de Labels. Que repito, cuando haces esto los eventos se estancan en el primer label donde se ha hecho MouseDown y no devuelven una porra. Como demuestra este gif animado (https://2.bp.blogspot.com/-3o1hwh9kKv8/V2BqOFUbyRI/AAAAAAAAAZM/Xj4qMv1NyuAebmt2Cdh18EPj-E4rk5QLgCLcB/s1600/ex_mouse.gif) El algoritmo: Código: -[(-Index)-int(X/20)] Donde: Index= Indice actual (que no cambia hasta que no se colorea un nuevo label, por eso se obtiene en el evento Paint) X = Posición X del cursor dentro del formulario 20 = Ancho del Label. Código
lo que hay en Form_Load es para crear los Labels, configurarlos, y los eventos . S2s Había una errata en Mouse_Down, ya está corregida (Al hacer clic se activaba el siguiente) Acabo de darme cuenta que el algoritmo funciona incluso aunque pongas 0 o 1 en lugar del máximo índice (N), de hecho se puede eliminar N. Ya lo he quitado. Código
Mejor así: Código
También se podría poner así: Código
Título: Re: Terminar evento MouseDown con el botón del ratón pulsado Publicado por: Eleкtro en 16 Junio 2016, 02:20 am en otro foro (en inglés) un usuario me ha puesto de los nervios porque no hacía más que decirme que era muy fácil, que usara MouseEnter, MouseLeave. Yo le dije que estos eventos no fucionan cuando arrastras el puntero con el bóton del ratón presionado, que no devuelven el índice del control donde se encuentra el puntero. De nuevo me contesta - ten encuenta el OOP, bla, bla, bla...-, jolines si es tan fácil teclea un poco y lo pones maldito hijo de la gran.... Igual se penseava que es sólo el clic. Hola Lekim. Si me equivoco en mis suposiciones, corrígeme, pero según leo en ese comentario das a entender que lo que realmente quieres hacer (ahora) es conseguir que se dispare el evento MouseDown en un control mientras mantienes presionado el botón izquierdo del mouse sobre el Form y arrastras el puntero hasta ese control. ¿es así?. Ahora saldrá el listo que dirá, pero si es muy fácil no hace falta hacer tanta historia... Es que es muy fácil, no hace falta hacer tanta historia ...xD. No, ahora en serio, si tu propósito es hacer lo que he mencionado, entonces solamente tienes que controlar e ignorar el mensaje de ventana que se procesa cuando presionas el botón izquierdo del mouse sobre el Form (o sobre la ventana Win32 que sea), es decir, el mensaje de ventana WM_LBUTTONDOWN (&H201). Esto puede interferir o no en lo que realmente quieras hacer, pero de todas formas te lo explicaré. Para ello simpelmente tienes que declarar un sustituto del controlador base de mensajes de ventana, el método WndProc: Código
Nota: El valor de retorno "0" realmente no es necesario, con dejar el bloque del Case vacío es suficiente, pero en las indicaciones de MSDN especifica que si procesamos el mensaje debemos devolver Cero ...por alguna razón será.
También te puede venir bien hacer uso del mensaje WM_NCHITTEST (&H84) junto a la enumeración de test de posicionamientos (ej. HTNOWHERE) que está documentada aquí abajo, pero esto es ya según lo que pretendas hacer.
Y ya que estamos, hago un poco de publicidad para recordarte que todo lo necesario (con respecto a lo que he explicado) lo puedes encontrar ya implementado en mi API (por si quieres trastear con la WinAPI sin tener que ponerte a declarar cientos de cosas):
EDITO: Si necesitas un ejemplo para controlar el mensaje WM_NCHITTEST, quizás te sirva esto:
Saludos. Título: Re: Terminar evento MouseDown con el botón del ratón pulsado Publicado por: Lekim en 16 Junio 2016, 02:34 am Hola Lekim. Si me equivoco en mis suposiciones, corrígeme, pero según leo en ese comentario das a entender que lo que realmente quieres hacer (ahora) es conseguir que se dispare el evento MouseDown en un control mientras mantienes presionado el botón izquierdo del mouse sobre el Form y arrastras el puntero hasta ese control. ¿es así?. No no es eso Elektro, pero parece que lo que has puesto puede servir, me lo voy a mirar. Pero bueno que ya está hecho y tampoco es tanto código. - Es código administrado - He reducido el código considerablemente - No tiene errores - Es puro Net - 100% cosecha propia ¿Cuál es la queja? XD Lo que has puesto es a la inversa en un principio quería enviar el mensaje WM_LBUTTONUP y Down desde un evento. Usé Mouse_Event para hacerlo, aunque ahora veo por lo que as posteado que también podía haber usado SendMessage. Pero era un parche por no poder capturar el índice del label en el cual estaba posado el cursor con el botón del Mouse apretado al arrastrarlo por los labels. Si reproduces el útlimo código que he posteado lo verás. Y si has usado mi piano pues es el efecto de arrastrar el dedo por las teclas. Apretas y arrastras, suena cada nota por la que va pasando el dedo, a la vez que se apagan por las que ya a pasado y a la vez que se cambia el color de la tacla en la que se encuentra el dedo (el puntero), se pone la tecla de nuevo blanca la que ya no tiene el dedo (el puntero) y todo sin soltar. Facilísimo!!! Título: Re: Terminar evento MouseDown con el botón del ratón pulsado Publicado por: Eleкtro en 16 Junio 2016, 05:24 am ¿Cuál es la queja? XD Por mi parte no hay ninguna queja, el código es tuyo y para ti, no para mi. Solo intento ayudarte a que puedas mejorar los hábitos de programación, pero como tu has dicho ya lo has resuelto de una manera, así que no hay que darle más vueltas. Saludos |