128 votes

Rendre un formulaire sans bordure mobile ?

Existe-t-il un moyen de rendre un formulaire qui n'a pas de bordure (FormBorderStyle est défini sur « aucun ») mobile lorsque la souris est cliquée sur le formulaire comme s'il y avait une bordure ?

291voto

Joey Points 148544

Cet article sur CodeProject détaille une technique. Se résume essentiellement à :

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool ReleaseCapture();

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{     
    if (e.Button == MouseButtons.Left)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    }
}

Cela fait exactement la même chose que de saisir la barre de titre d'une fenêtre, du point de vue du gestionnaire de fenêtres.

41voto

elimad Points 46

Une autre façon plus simple de faire la même chose.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        // set this.FormBorderStyle to None here if needed
        // if set to none, make sure you have a way to close the form!
    }
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_NCHITTEST)
            m.Result = (IntPtr)(HT_CAPTION);
    }

    private const int WM_NCHITTEST = 0x84;
    private const int HT_CLIENT = 0x1;
    private const int HT_CAPTION = 0x2;
}

20voto

junmats Points 1042

utilisez MouseDown, MouseMove et MouseUp. Vous pouvez définir un drapeau de variable pour cela. J'ai un échantillon, mais je pense que vous devez le réviser.

Je code l'action de la souris sur un panneau. Une fois que vous cliquez sur le panneau, votre formulaire se déplace avec lui.

//Global variables;
private bool _dragging = false;
private Point _offset;
private Point _start_point=new Point(0,0);


private void panel1_MouseDown(object sender, MouseEventArgs e)
{
   _dragging = true;  // _dragging is your variable flag
   _start_point = new Point(e.X, e.Y);
}

private void panel1_MouseUp(object sender, MouseEventArgs e)
{
   _dragging = false; 
}

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
  if(_dragging)
  {
     Point p = PointToScreen(e.Location);
     Location = new Point(p.X - this._start_point.X,p.Y - this._start_point.Y);     
  }
}

13voto

Chris Points 2982

WPF uniquement


n'ont pas le code exact à portée de main, mais dans un projet récent, je pense que j'ai utilisé l'événement MouseDown et simplement mettre ceci :

frmBorderless.DragMove();

Méthode Window.DragMove (MSDN)

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