visual net eventos evento event doble derecho crear c# winforms mouseevent

net - eventos del mouse en c#



Pasar eventos de mouse al control principal (3)

Medio ambiente: .NET Framework 2.0, VS 2008.

MouseMove crear una subclase de ciertos controles .NET (etiqueta, panel) que pasarán por ciertos eventos del mouse ( MouseDown , MouseMove , MouseUp ) a su control principal (o alternativamente al formulario de nivel superior). Puedo hacer esto creando controladores para estos eventos en instancias de los controles estándar, por ejemplo:

public class TheForm : Form { private Label theLabel; private void InitializeComponent() { theLabel = new Label(); theLabel.MouseDown += new MouseEventHandler(theLabel_MouseDown); } private void theLabel_MouseDown(object sender, MouseEventArgs e) { int xTrans = e.X + this.Location.X; int yTrans = e.Y + this.Location.Y; MouseEventArgs eTrans = new MouseEventArgs(e.Button, e.Clicks, xTrans, yTrans, e.Delta); this.OnMouseDown(eTrans); } }

No puedo mover el controlador de eventos a una subclase del control, porque los métodos que generan los eventos en el control primario están protegidos y no tengo un calificador para el control principal:

No se puede acceder al miembro protegido System.Windows.Forms.Control.OnMouseDown(System.Windows.Forms.MouseEventArgs) mediante un calificador de tipo System.Windows.Forms.Control ; el calificador debe ser del tipo TheProject.NoCaptureLabel (o derivado de él).

Estoy buscando anular el método de control WndProc en mi subclase, pero espero que alguien me pueda dar una solución más limpia.


El estilo de ventana extendida WS_EX_TRANSPARENT realidad hace esto (es lo que usan los tooltips in-situ). Es posible que desee considerar la aplicación de este estilo en lugar de codificar muchos manipuladores para que lo hagan por usted.

Para hacer esto, anule el método CreateParams :

protected override CreateParams CreateParams { get { CreateParams cp=base.CreateParams; cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT return cp; } }

Para lectura adicional:


Necesita escribir un método público / protegido en su clase base que planteará el evento para usted. Luego llama a este método desde la clase derivada.

O

¿Es esto lo que quieres?

public class MyLabel : Label { protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); //Do derived class stuff here } }


Sí. Después de mucha búsqueda, encontré el artículo "Controles flotantes, tooltip-style" , que usa WndProc para cambiar el mensaje de WM_NCHITTEST a HTTRANSPARENT , haciendo que el Control transparente para los eventos del mouse.

Para lograr eso, crea un control heredado de Label y simplemente agrega el siguiente código.

protected override void WndProc(ref Message m) { const int WM_NCHITTEST = 0x0084; const int HTTRANSPARENT = (-1); if (m.Msg == WM_NCHITTEST) { m.Result = (IntPtr)HTTRANSPARENT; } else { base.WndProc(ref m); } }

He probado esto en Visual Studio 2010 con .NET Framework 4 Client Profile.