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

StackOverflow https://stackoverflow.com/questions/1241812

  •  12-09-2019
  •  | 
  •  

Question

En utilisant C #.
Je suis en train 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

Il fonctionne aussi longtemps que je ne contiendraient pas FormBorderStyle comme None.

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

Était-ce utile?

La solution

Je sais que cette question est plus d'un an, mais je cherchais à essayer de se rappeler comment je l'ai fait dans le passé. Donc, pour toute personne de référence d'autre, le moyen le plus rapide et moins complexe le lien ci-dessus est de passer outre 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 toute forme de déplacer en cliquant et en faisant glisser dans la zone client.

Autres conseils

Ici, il est la meilleure façon que je l'ai trouvé. Il est une « façon .NET », wihout en utilisant WndProc. Il suffit de gérer les MouseDown, MouseMove et les événements MouseUp des surfaces que vous voulez être draggable.

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

J'ai eu la même question il y a un certain temps et en cherchant la réponse que je trouve le code ci-dessous (ne me souviens pas du site) 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;
    }

D'abord, nous devrons utiliser les services Interop en utilisant l'espace de noms comme

using System.Runtime.InteropServices;

La prochaine chose serait de définir les messages qui se chargeront de déplacer la forme. Nous aurons ce que les variables membres de 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 allons écrire le code pour envoyer le message à chaque fois que l'utilisateur appuie sur le bouton de la souris. Le formulaire sera repositionné selon le mouvement de la souris si l'utilisateur maintenez le bouton de la souris enfoncé.

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

Reportez-vous ce lien Dragable formulaire

Crédits Rahul-Rajat-singh

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);
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top