19 votes

Comment déplacer un formulaire Windows lorsque sa propriété FormBorderStyle est définie sur None ?

Utilisation de C#.
J'essaie de déplacer un Form sans sa barre de titre.
J'ai trouvé un article à ce sujet sur : http://www.codeproject.com/KB/cs/csharpmovewindow.aspx

Cela fonctionne tant que je ne mets pas FormBorderStyle comme None .

Existe-t-il un moyen de le faire fonctionner avec cette propriété définie comme None ?

46voto

ShaneB Points 1384

Je sais que cette question date de plus d'un an, mais j'ai cherché en essayant de me rappeler comment j'ai procédé dans le passé. Donc, pour la référence de quiconque, le moyen le plus rapide et le moins complexe que le lien ci-dessus est de remplacer la fonction WndProc.

/*
Constants in Windows API
0x84 = WM_NCHITTEST - Mouse Capture Test
0x1 = HTCLIENT - Application Client Area
0x2 = HTCAPTION - Application Title Bar

This function intercepts all the commands sent to the application. 
It checks to see of the message is a mouse click in the application. 
It passes the action to the base action by default. It reassigns 
the action to the title bar if it occured in the client area
to allow the drag and move behavior.
*/

protected override void WndProc(ref Message m)
{
    switch(m.Msg)
    {
        case 0x84:
            base.WndProc(ref m);
            if ((int)m.Result == 0x1)
                m.Result = (IntPtr)0x2;
            return;
    }

    base.WndProc(ref m);
}

Cela permettra de déplacer n'importe quel formulaire en cliquant et en glissant dans la zone client.

41voto

cprcrack Points 3040

Voici la meilleure façon que j'ai trouvée. Il s'agit d'une méthode ".NET", sans utiliser WndProc, il suffit de gérer les événements MouseDown, MouseMove et MouseUp des surfaces que l'on veut faire glisser.

private bool dragging = false;
private Point dragCursorPoint;
private Point dragFormPoint;

private void FormMain_MouseDown(object sender, MouseEventArgs e)
{
    dragging = true;
    dragCursorPoint = Cursor.Position;
    dragFormPoint = this.Location;
}

private void FormMain_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        Point dif = Point.Subtract(Cursor.Position, new Size(dragCursorPoint));
        this.Location = Point.Add(dragFormPoint, new Size(dif));
    }
}

private void FormMain_MouseUp(object sender, MouseEventArgs e)
{
    dragging = false;
}

3voto

Ryu Points 161

J'ai eu la même question il y a quelques temps et en cherchant la réponse, j'ai trouvé le code ci-dessous (je ne me souviens pas du site web) et voici ce que je fais :

    Point mousedownpoint = Point.Empty;

    private void Form_MouseDown(object sender, MouseEventArgs e)
    {
        mousedownpoint = new Point(e.X, e.Y);
    }

    private void Form_MouseMove(object sender, MouseEventArgs e)
    {

        if (mousedownpoint.IsEmpty)
            return;
        Form f = sender as Form;
        f.Location = new Point(f.Location.X + (e.X - mousedownpoint.X), f.Location.Y + (e.Y - mousedownpoint.Y));

    }

    private void Form_MouseUp(object sender, MouseEventArgs e)
    {
        mousedownpoint = Point.Empty;
    }

0voto

thejustv Points 16

Tout d'abord nous devrons utiliser les services interop en utilisant l'espace de nom comme

using System.Runtime.InteropServices;

La prochaine étape consisterait à définir les messages qui se chargeront de déplacer le formulaire. Il s'agira de variables membres de la classe

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();

et enfin nous écrirons le code pour envoyer le message chaque fois que l'utilisateur appuie sur le bouton de la souris. Le formulaire sera repositionné en fonction du mouvement de la souris si l'utilisateur maintient le bouton de la souris enfoncé.

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    ReleaseCapture();
    SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
}

Voir ce lien Formulaire à glisser

Crédits pour rahul-rajat-singh

0voto

aya ali rayan Points 1

Point mousedownpoint = Point.Empty ;

    private void Form_MouseDown(object sender, MouseEventArgs e)
    {
        mousedownpoint = new Point(e.X, e.Y);
    }

    private void Form_MouseMove(object sender, MouseEventArgs e)
    {

        if (mousedownpoint.IsEmpty)
            return;
        Form f = sender as Form;
        f.Location = new Point(f.Location.X + (e.X - mousedownpoint.X), f.Location.Y + (e.Y - mousedownpoint.Y));

    }

    private void Form_MouseUp(object sender, MouseEventArgs e)
    {
        mousedownpoint = Point.Empty;
    }

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        Form_MouseDown(this, e);
    }

    private void panel1_MouseUp(object sender, MouseEventArgs e)
    {
        Form_MouseUp(this, e);
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        Form_MouseMove(this, e);
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X