2009-10-22 4 views
5

다음 코드를 사용하여 양식 자체를 클릭하고 끌어 경계선없는 양식을 끌 수 있습니다. 그것은 작동하지만 폼에있는 컨트롤을 클릭하고 끌 때 사용할 수는 없습니다. 컨트롤 중 일부를 클릭 할 때 드래그 할 수 있어야하지만 다른 컨트롤은 드래그 할 수 없도록해야합니다. 레이블로 끌기는하지만 버튼이나 텍스트 상자로 끌면 안됩니다. 어떻게해야합니까?C# : 폼에서 드래그하는 방법과 컨트롤?

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

답변

3

사실, 해결책을 찾았습니다 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); 
} 

작동합니다. 크기 조정이 필요한 경우

또한, 위의 내 코드에서, 문

 if (m.Msg == WM_NCHITTEST) 
      if ((int)m.Result == HTCLIENT) 
       m.Result = (IntPtr)HTCAPTION; 
변경해야하는 경우
1

어떤 컨트롤이 어떤 Windows 메시지를 받고 있는지 분석하기 위해 Spy ++를 사용하면 캡처해야하는 항목을 알 수 있습니다.

코드를 자세히 살펴 보지 않고도 주 창에서 하위 컨트롤이 양식이 아닌 메시지를받는 것으로 상상하고 있습니다.이 중 일부에 구체적으로 응답하고 싶습니다.

관련 문제