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;
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top