C#: 양식과 해당 컨트롤로 A를 드래그하는 방법은 무엇입니까?
문제
다음 코드를 사용하여 양식 자체를 클릭하고 드래그하여 테두리 형식을 드래그합니다. 작동하지만 양식에있는 컨트롤을 클릭하고 드래그 할 때는 그렇지 않습니다. 일부 컨트롤을 클릭하면 다른 컨트롤을 클릭 할 때 드래그 할 수 있어야하지만 다른 컨트롤은 레이블로 드래그하지만 버튼과 텍스트 상자는 그렇지 않습니다. 어떻게해야하나요?
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 메시지를받는 컨트롤을 분석하면 캡처해야 할 사항을 알 수 있습니다.
코드를 깊이 살펴 보지 않고 메인 창의 어린이 컨트롤이 양식이 아닌 메시지를 받고 있으며 구체적으로 이들 중 일부에 응답하고 싶다고 상상하고 있습니다.
제휴하지 않습니다 StackOverflow