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 ?
Réponses
Trop de publicités?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.
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;
}
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);
}
}