Cita de: Lekim en 16 Junio 2016, 01:13 AMen 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í?.
Cita de: Lekim en 16 Junio 2016, 01:13 AMAhora 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 (vbnet) [Seleccionar]
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):
- ElektroKit/Solution/Elektro.Interop/Win32/Enums/WindowsMessages.vb
- ElektroKit/Solution/Elektro.Interop/Win32/Enums/WindowHitTestRegions.vb
EDITO:
Si necesitas un ejemplo para controlar el mensaje WM_NCHITTEST, quizás te sirva esto:
(localiza el método WndProc)
Saludos.