Frage

Ich verwende den folgenden Code eine randlose Form zu ziehen, durch Klicken und Ziehen Sie das Formular selbst. Es funktioniert, aber es funktioniert nicht, wenn Sie klicken und ein Steuerelement ziehen auf dem Formular befindet. Ich muss in der Lage, es zu ziehen, wenn sie auf einige der Kontrollen angeklickt, andere aber nicht - ziehen von Etiketten, aber nicht durch Tasten und Textfelder. Wie mache ich das?

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;
}
War es hilfreich?

Lösung

Eigentlich fand ich die Lösung hier .

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

es funktioniert.

Auch oben in meinem Code, wenn Größenänderung gewünscht wird, wenn Anweisung geändert werden soll, um

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

Andere Tipps

Verwenden Sie Spy ++ zu analysieren, was Kontrollen erhalten, was Windows-Nachrichten, dann wissen Sie, was Sie zu erfassen müssen.

Ohne tief in Ihrem Code suchen Ich stelle mir vor, dass Kind Kontrollen im Hauptfenster werden die Nachrichten, anstatt die Form zu empfangen und Sie wollen einige davon speziell reagieren zu können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top