Cita de: Lekim en 14 Junio 2016, 10:01 AM
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 (vbnet) [Seleccionar]
''' ----------------------------------------------------------------------------------------------------
''' <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:
Código (vbnet) [Seleccionar]
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/Sb90A5nP
Saludos!