Question

J'utilise le code suivant pour faire glisser un formulaire sans bordure en cliquant sur le formulaire et en le faisant glisser. Cela fonctionne, mais cela ne fonctionne pas lorsque vous cliquez et faites glisser un contrôle situé sur le formulaire. Je dois pouvoir le faire glisser lorsque vous cliquez sur certains contrôles mais pas d'autres - faites-le glisser par les étiquettes, mais pas par les boutons et les zones de texte. Comment je le fais?

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;
}
Était-ce utile?

La solution

En fait, j'ai trouvé la solution ici .

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

ça marche.

En outre, dans mon code ci-dessus, si le redimensionnement est souhaité, si l'instruction doit être remplacée par

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

Autres conseils

Utilisez Spy ++ pour analyser quels contrôles reçoivent quels messages Windows, vous saurez alors ce que vous devez capturer.

Sans regarder votre code de manière approfondie, j'imagine que les contrôles enfants de la fenêtre principale reçoivent des messages plutôt que le formulaire et que vous souhaitez répondre à certains d'entre eux de manière spécifique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top