문제

다음 코드를 사용하여 양식 자체를 클릭하고 드래그하여 테두리 형식을 드래그합니다. 작동하지만 양식에있는 컨트롤을 클릭하고 드래그 할 때는 그렇지 않습니다. 일부 컨트롤을 클릭하면 다른 컨트롤을 클릭 할 때 드래그 할 수 있어야하지만 다른 컨트롤은 레이블로 드래그하지만 버튼과 텍스트 상자는 그렇지 않습니다. 어떻게해야하나요?

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;
}
도움이 되었습니까?

해결책

사실, 나는 해결책을 찾았다 여기.

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;

다른 팁

Spy ++를 사용하여 Windows 메시지를받는 컨트롤을 분석하면 캡처해야 할 사항을 알 수 있습니다.

코드를 깊이 살펴 보지 않고 메인 창의 어린이 컨트롤이 양식이 아닌 메시지를 받고 있으며 구체적으로 이들 중 일부에 응답하고 싶다고 상상하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top