简体   繁体   中英

How do I make mousedrag inside Panel move form window?

I have this System.Windows.Forms.Panel that I want to enable so that if the user click and drags the mouse drags the window around to.

Can I do this? Do i have to implement multiple events?

The Solution that works best for me is using unmanaged code, which gives you smooth window movements unlike the answer posted by HatSoft.

3 small steps to drag your window on Panel movement

using System.Runtime.InteropServices;

add these six lines inside your class

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

and your MouseMove event on Panel should look like this

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

posted it a little late :) , who knows we might need it again in future.

You can achieve it by using the MouseMove Event of the panel

Example should be something like this (Sorry have not tested it)

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        this.Location = new Point(Cursor.Position.X + e.X , Cursor.Position.Y + e.Y);
    }
}

You might want to take a look at this component that I pasted here:

http://pastebin.com/5ufJmuay

It is a component that you will be able to drop on a form, and then drag the form by dragging inside it.

Currently Set For A Panel. VS C# Just Messing About Seems to work for me as I wanted Sets application left-top corner to mouse position while left-click is pressed.

 public form1()
    {
        InitializeComponent();
        this.panel2.MouseMove += new MouseEventHandler(panel2_MouseMove);
    }
    
    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);
    
    private void panel2_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            
            Point loc1 = MousePosition;
            this.Location = loc1;
        }
    }

Hey Hope this works for you

  1. First you have to put a panel on your form and dock it to top
  2. Then add these lines of codes

using System.Runtime.InteropServices;

public partial class Main_FM : Form
{

  [DllImport("user32.dll", EntryPoint = "ReleaseCapture")]
    private extern static void ReleaseCapture();

  [DllImport("user32.dll", EntryPoint = "SendMessage")]
    private extern static void SendMessge(System.IntPtr hwnd, int wmsg, int wparam, int lparam);

}
  1. The create the MouseDown event on the panel and add these codes:
 private void Top_PNL_MouseDown(object sender, MouseEventArgs e)
  {
      ReleaseCapture();
      SendMessge(this.Handle, 0x112, 0xf012, 0);
  }

Bravo 的代码工作得非常好,但是直到我在我想要移动的面板的->properties->event 部分中明确启用 MouseMove 事件之前,我无法让它工作。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM