Autor
|
Tema: Terminar evento MouseDown con el botón del ratón pulsado (Leído 7,557 veces)
|
Lekim
Desconectado
Mensajes: 268
|
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). 'Programmed by Lekim' Option Strict On Imports System.Runtime.InteropServices Public Class Form1 <DllImport("user32.dll")> _ Private Shared Sub mouse_event(ByVal dwFlags As UInteger, _ ByVal dx As UInteger, _ ByVal dy As UInteger, _ ByVal dwData As UInteger, _ ByVal dwExtraInfo As Integer) End Sub Dim lblkey(5) As Label Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim locLBL As New Point(10, 10) Dim inc As Integer For I As Integer = 0 To 5 lblkey(I) = New Label lblkey(I).Size = CType(New Point(20, 100), Drawing.Size) lblkey(I).BorderStyle = BorderStyle.FixedSingle lblkey(I).Location = New Point(locLBL.X + inc, locLBL.Y) Me.Controls.Add(lblkey(I)) inc += 19 Next For I As Integer = 0 To 5 AddHandler lblkey(I).MouseDown, AddressOf lblkey_MouseDown AddHandler lblkey(I).MouseUp, AddressOf lblkey_MouseUp AddHandler lblkey(I).MouseMove, AddressOf lblkey_MouseMove Next End Sub Private Sub lblkey_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim Index As Integer = Array.IndexOf(lblkey, sender) Dim mPoint As New Point(Me.PointToClient(Cursor.Position).X, Me.PointToClient(Cursor.Position).Y) Dim X As Integer = mPoint.X If X < CInt(lblkey(Index).Left) Or X > (CInt(lblkey(Index).Left) + _ CInt(lblkey(Index).Width)) Then EventoUp() EventoDown() End If End Sub Private Sub lblkey_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim Index As Integer = Array.IndexOf(lblkey, sender) If Button.MouseButtons = MouseButtons.Left Then lblkey(Index).BackColor = Color.Azure End If End Sub Private Sub lblkey_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim Index As Integer = Array.IndexOf(lblkey, sender) lblkey(Index).BackColor = Color.Transparent End Sub End Class Module modEventMouse <DllImport("user32.dll")> _ Public Sub mouse_event(ByVal dwFlags As UInteger, _ ByVal dx As UInteger, _ ByVal dy As UInteger, _ ByVal dwData As UInteger, _ ByVal dwExtraInfo As Integer) End Sub <Flags()> _ Public Enum MouseEventFlags As UInteger MOUSEEVENTF_ABSOLUTE = &H8000 MOUSEEVENTF_LEFTDOWN = &H2 MOUSEEVENTF_LEFTUP = &H4 MOUSEEVENTF_MIDDLEDOWN = &H20 MOUSEEVENTF_MIDDLEUP = &H40 MOUSEEVENTF_MOVE = &H1 MOUSEEVENTF_RIGHTDOWN = &H8 MOUSEEVENTF_RIGHTUP = &H10 MOUSEEVENTF_XDOWN = &H80 MOUSEEVENTF_XUP = &H100 MOUSEEVENTF_WHEEL = &H800 MOUSEEVENTF_HWHEEL = &H1000 End Enum ''' <summary> ''' Simulate MouseDown the left mouse button ''' </summary> ''' <remarks></remarks> Public Sub EventoDown() Call modEventMouse.mouse_event(MouseEventFlags.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) End Sub ''' <summary> ''' Simulate MouseUp the left mouse button ''' </summary> ''' <remarks></remarks> Public Sub EventoUp() Call modEventMouse.mouse_event(MouseEventFlags.MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0) End Sub End Module
|
|
« Última modificación: 14 Junio 2016, 11:10 am por Lekim »
|
En línea
|
|
|
|
DarK_FirefoX
Desconectado
Mensajes: 1.263
Be the change you wanna see in te world
|
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
|
|
|
En línea
|
|
|
|
Lekim
Desconectado
Mensajes: 268
|
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... He conseguido hacerlo pero solo funciona cuando mueves a la izquierda pero no a la derecha, usando API. Imports System.Runtime.InteropServices Public Class Form1 <DllImport("user32.dll")> _ Private Shared Sub mouse_event(ByVal dwFlags As UInteger, ByVal dx As UInteger, ByVal dy As UInteger, ByVal dwData As UInteger, ByVal dwExtraInfo As Integer) End Sub Const MOUSEEVENTF_MOVE = &H1 ' movimiento del mouse Const MOUSEEVENTF_LEFTDOWN = &H2 ' botón izquierdo presionado Const MOUSEEVENTF_LEFTUP = &H4 ' botón izquierdo soltado Const MOUSEEVENTF_RIGHTDOWN = &H8 ' botón derecho presionado Const MOUSEEVENTF_RIGHTUP = &H10 ' botón derecho soltado Const MOUSEEVENTF_MIDDLEDOWN = &H20 ' botón central presionado Const MOUSEEVENTF_MIDDLEUP = &H40 ' botón central soltado Const MOUSEEVENTF_ABSOLUTE = &H8000 ' movimiento absoluto Dim lblkey(2) As Label Dim Pulsado As Integer = False Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim locLBL As New Point(10, 10) Dim inc As Integer For I As Integer = 0 To 2 lblkey(I) = New Label lblkey(I).Size = New Point(20, 100) lblkey(I).BorderStyle = BorderStyle.FixedSingle lblkey(I).Location = New Point(locLBL.X + inc, locLBL.Y) Me.Controls.Add(lblkey(I)) inc += 19 Next For I As Integer = 0 To 2 AddHandler lblkey(I).MouseDown, AddressOf lblkey_MouseDown AddHandler lblkey(I).MouseUp, AddressOf lblkey_MouseUp AddHandler lblkey(I).MouseEnter, AddressOf lblkey_MouseEnter AddHandler lblkey(I).Click, AddressOf lblkey_MouseClick AddHandler lblkey(I).MouseMove, AddressOf lblkey_MouseMove Next End Sub Private Sub lblkey_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim Index As Integer = Array.IndexOf(lblkey, sender) Dim punto As New Point(Me.PointToClient(Cursor.Position)) Dim X As Integer = punto.X If X < CInt(lblkey(Index).Left) Or X > (CInt(lblkey(Index).Left) + CInt(lblkey(Index).Width)) And _ Button.MouseButtons = MouseButtons.Left And Pulsado = True Then SueltaBoton() ClicBoton() End If End Sub Private Sub lblkey_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim Index As Integer = Array.IndexOf(lblkey, sender) If Button.MouseButtons = MouseButtons.Left Then lblkey(Index).BackColor = Color.Azure End If End Sub Private Sub lblkey_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) End Sub Private Sub lblkey_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) End Sub Private Sub lblkey_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim Index As Integer = Array.IndexOf(lblkey, sender) lblkey(Index).BackColor = Color.Transparent End Sub Public Sub ClicBoton() 'Simula el clic del boton izquierdo del ratón Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) End Sub Public Sub SueltaBoton() 'Simula el clic del boton izquierdo del ratón Call mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0) End Sub End Class
¡¡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. 'Programmed by Lekim' Option Strict On Imports System.Runtime.InteropServices Public Class Form1 <DllImport("user32.dll")> _ Private Shared Sub mouse_event(ByVal dwFlags As UInteger, _ ByVal dx As UInteger, _ ByVal dy As UInteger, _ ByVal dwData As UInteger, _ ByVal dwExtraInfo As Integer) End Sub Dim lblkey(5) As Label Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim locLBL As New Point(10, 10) Dim inc As Integer For I As Integer = 0 To 5 lblkey(I) = New Label lblkey(I).Size = CType(New Point(20, 100), Drawing.Size) lblkey(I).BorderStyle = BorderStyle.FixedSingle lblkey(I).Location = New Point(locLBL.X + inc, locLBL.Y) Me.Controls.Add(lblkey(I)) inc += 19 Next For I As Integer = 0 To 5 AddHandler lblkey(I).MouseDown, AddressOf lblkey_MouseDown AddHandler lblkey(I).MouseUp, AddressOf lblkey_MouseUp AddHandler lblkey(I).MouseMove, AddressOf lblkey_MouseMove Next End Sub Private Sub lblkey_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim Index As Integer = Array.IndexOf(lblkey, sender) Dim mPoint As New Point(Me.PointToClient(Cursor.Position).X, Me.PointToClient(Cursor.Position).Y) Dim X As Integer = mPoint.X If X < CInt(lblkey(Index).Left) Or X > (CInt(lblkey(Index).Left) + _ CInt(lblkey(Index).Width)) Then EventoUp() EventoDown() End If End Sub Private Sub lblkey_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim Index As Integer = Array.IndexOf(lblkey, sender) If Button.MouseButtons = MouseButtons.Left Then lblkey(Index).BackColor = Color.Azure End If End Sub Private Sub lblkey_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim Index As Integer = Array.IndexOf(lblkey, sender) lblkey(Index).BackColor = Color.Transparent End Sub End Class Module modEventMouse <DllImport("user32.dll")> _ Public Sub mouse_event(ByVal dwFlags As UInteger, _ ByVal dx As UInteger, _ ByVal dy As UInteger, _ ByVal dwData As UInteger, _ ByVal dwExtraInfo As Integer) End Sub <Flags()> _ Public Enum MouseEventFlags As UInteger MOUSEEVENTF_ABSOLUTE = &H8000 MOUSEEVENTF_LEFTDOWN = &H2 MOUSEEVENTF_LEFTUP = &H4 MOUSEEVENTF_MIDDLEDOWN = &H20 MOUSEEVENTF_MIDDLEUP = &H40 MOUSEEVENTF_MOVE = &H1 MOUSEEVENTF_RIGHTDOWN = &H8 MOUSEEVENTF_RIGHTUP = &H10 MOUSEEVENTF_XDOWN = &H80 MOUSEEVENTF_XUP = &H100 MOUSEEVENTF_WHEEL = &H800 MOUSEEVENTF_HWHEEL = &H1000 End Enum ''' <summary> ''' Simulate MouseDown the left mouse button ''' </summary> ''' <remarks></remarks> Public Sub EventoDown() Call modEventMouse.mouse_event(MouseEventFlags.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) End Sub ''' <summary> ''' Simulate MouseUp the left mouse button ''' </summary> ''' <remarks></remarks> Public Sub EventoUp() Call modEventMouse.mouse_event(MouseEventFlags.MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0) End Sub End Module
¿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.
|
|
« Última modificación: 13 Junio 2016, 20:57 pm por Lekim »
|
En línea
|
|
|
|
DarK_FirefoX
Desconectado
Mensajes: 1.263
Be the change you wanna see in te world
|
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
|
|
|
En línea
|
|
|
|
Lekim
Desconectado
Mensajes: 268
|
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
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.878
|
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: ''' ---------------------------------------------------------------------------------------------------- ''' <summary> ''' Gets the corresponding control (if any) that is over the specified mouse point. ''' </summary> ''' ---------------------------------------------------------------------------------------------------- ''' <param name="container"> ''' The source container of controls where to search for. ''' <para></para> ''' Normally a <see cref="Form"/>, but you can specify another <see cref="Control"/> that contains a <see cref="ControlCollection"/>. ''' </param> ''' ''' <param name="pt"> ''' The mouse point. ''' </param> ''' ---------------------------------------------------------------------------------------------------- ''' <returns> ''' The resulting <see cref="Control"/>, or <see langword="Nothing"/>. ''' </returns> ''' ---------------------------------------------------------------------------------------------------- Public Shared Function GetControlFromPoint(ByVal container As Control, ByVal pt As Point) As Control Dim child As Control = container Dim nextChild As Control = Nothing Do While True For Each ctrl As Control In child.Controls If (ctrl.Visible) AndAlso (ctrl.ClientRectangle.Contains(ctrl.PointToClient(pt))) Then nextChild = ctrl Exit For End If Next ctrl If (nextChild Is Nothing) Then If (container.ClientRectangle.Contains(container.PointToClient(pt))) Then Return container Else Return Nothing End If ElseIf (child.Equals(nextChild)) Then Exit Do Else child = nextChild End If Loop Return child End Function
Ejemplo de uso: Dim ctrl As Control = GetControlFromPoint(Me, Cursor.Position)
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/Sb90A5nPSaludos!
|
|
« Última modificación: 14 Junio 2016, 22:53 pm por Eleкtro »
|
En línea
|
|
|
|
Lekim
Desconectado
Mensajes: 268
|
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 El algoritmo: 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. Option Strict On Imports System.Runtime.InteropServices Public Class Form1 Dim lblkey(5) As Label Dim index As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim locLBL As New Point(10, 10) Dim inc As Integer For I As Integer = 0 To 5 lblkey(I) = New Label lblkey(I).Size = CType(New Point(20, 100), Drawing.Size) lblkey(I).BorderStyle = BorderStyle.FixedSingle lblkey(I).Location = New Point(locLBL.X + inc, locLBL.Y) Me.Controls.Add(lblkey(I)) inc += 19 Next For I As Integer = 0 To 5 AddHandler lblkey(I).MouseDown, AddressOf lblkey_MouseDown AddHandler lblkey(I).MouseUp, AddressOf lblkey_MouseUp AddHandler lblkey(I).MouseMove, AddressOf lblkey_MouseMove AddHandler lblkey(I).Paint, AddressOf lblkey_Paint Next End Sub Private Sub lblkey_Paint(ByVal sender As Object, ByVal e As System.EventArgs) index = Array.IndexOf(lblkey, sender) End Sub Private Sub lblkey_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim lblPoint As New _ Point(lblkey(index).PointToClient(Cursor.Position).X, _ lblkey(index).PointToClient(Cursor.Position).Y) If e.Button = System.Windows.Forms.MouseButtons.Left Then Dim newIndex As Double = - ((- index) - Conversion.Int(lblPoint.X / 20)) Try Dim AllIndexs As New List(Of Integer)({0, 1, 2, 3, 4, 5}) AllIndexs.Remove(CInt(newIndex)) For Each El As Integer In AllIndexs lblkey(El).BackColor = Color.Transparent Next lblkey(CInt(newIndex)).BackColor = Color.Red Catch ex As Exception End Try End If End Sub Private Sub lblkey_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim indexDwn As Integer = Array.IndexOf(lblkey, sender) lblkey(indexDwn).BackColor = Color.Red End Sub Private Sub lblkey_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) For I As Integer = 0 To lblkey.Count - 1 lblkey(I).BackColor = Color.Transparent Next End Sub End Class
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. Dim newIndex As Double = N - ((N -index) - Conversion.Int(lblPoint.X / 20))
Mejor así: Dim newIndex As Double = - ((-index) - Conversion.Int(lblPoint.X / 20))
También se podría poner así: Dim newIndex As Double = ((index * (-1)) - Conversion.Int(lblPoint.X / 20)) * (-1)
|
|
« Última modificación: 20 Junio 2016, 00:38 am por Lekim »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.878
|
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: Public NotInheritable Class Form1 : Inherits Form Private Sub TextBox1_MouseEnter(sender As Object, e As EventArgs) Handles TextBox1.MouseEnter MsgBox("Hello World!") End Sub Protected Overrides Sub WndProc(ByRef m As Message) Select Case m.Msg Case &H201 ' WM_LButtonDown m.Result = IntPtr.Zero Case Else ' Return message to base message handler. MyBase.WndProc(m) End Select End Sub End Class
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: (localiza el método WndProc) Saludos.
|
|
« Última modificación: 16 Junio 2016, 02:38 am por Eleкtro »
|
En línea
|
|
|
|
Lekim
Desconectado
Mensajes: 268
|
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!!!
|
|
« Última modificación: 20 Junio 2016, 00:34 am por Lekim »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.878
|
¿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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Common Dialog ¿Como se que boton ha pulsado el usuario?
Programación Visual Basic
|
{_The_Alwar_}
|
5
|
4,558
|
29 Septiembre 2005, 22:12 pm
por {_The_Alwar_}
|
|
|
Terminar un evento en c#
.NET (C#, VB.NET, ASP)
|
joalbela
|
1
|
4,365
|
16 Junio 2011, 22:29 pm
por joalbela
|
|
|
Evaluar evento de un boton
PHP
|
phsilver
|
4
|
2,623
|
14 Agosto 2013, 00:56 am
por basickdagger
|
|
|
Me lo apagaron dejando pulsado el botón de encendido y ahora no enciende
Hardware
|
jose89jr
|
5
|
5,214
|
22 Mayo 2017, 03:59 am
por Randomize
|
|
|
¿Se rompe el ordenador si lo reinicias manteniendo pulsado el botón de apagado?
Noticias
|
wolfbcn
|
1
|
2,102
|
22 Mayo 2017, 15:19 pm
por Randomize
|
|