C #: ¿Cómo arrastrar un desde el formulario y sus controles?
Pregunta
Utilizo el siguiente código para arrastrar un formulario sin bordes, haciendo clic y arrastrando el formulario. Funciona, pero no para cuando hace clic y arrastra un control ubicado en el formulario. Necesito poder arrastrarlo cuando se hace clic en algunos de los controles pero no en otros, arrastre por etiquetas, pero no por botones y cuadros de texto. ¿Cómo lo hago?
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
const int WM_NCHITTEST = 0x84;
const int HTCLIENT = 0x1;
const int HTCAPTION = 0x2;
if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT)
m.Result = (IntPtr)HTCAPTION;
}
Solución
En realidad, encontré la solución here .
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HTCAPTION = 0x2;
[DllImport("User32.dll")]
public static extern bool ReleaseCapture();
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
// Paste the below code in the your label control MouseDown event
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
funciona.
También, en mi código anterior, si se desea cambiar el tamaño, si se debe cambiar la declaración a
if (m.Msg == WM_NCHITTEST)
if ((int)m.Result == HTCLIENT)
m.Result = (IntPtr)HTCAPTION;
Otros consejos
Usa Spy ++ para analizar qué controles reciben qué mensajes de Windows, luego sabrás lo que necesitas capturar.
Sin mirar detenidamente su código, me imagino que los controles secundarios en la ventana principal reciben mensajes en lugar del formulario y usted desea responder a algunos de estos específicamente.