2009-10-22 26 views
5

Utilizo el siguiente código para arrastrar 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 al hacer clic en algunos de los controles, pero no en otros, arrastrar por etiquetas, pero no mediante botones y cuadros de texto. ¿Cómo lo hago?C#: ¿Cómo arrastrar desde el formulario y sus controles?

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; 
} 

Respuesta

3

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.

Además, en mi código anterior, si se desea cambiar el tamaño, si la declaración se debe cambiar a

 if (m.Msg == WM_NCHITTEST) 
      if ((int)m.Result == HTCLIENT) 
       m.Result = (IntPtr)HTCAPTION; 
1

Utilice Spy ++ para analizar qué controles están recibiendo qué Mensajes de Windows, entonces sabrá lo que necesita capturar.

Sin mirar atentamente su código, me imagino que los controles secundarios en la ventana principal están recibiendo mensajes en lugar del formulario y desea responder a algunos de ellos específicamente.

Cuestiones relacionadas