10

我有我想要启用的 System.Windows.Forms.Panel,这样如果用户单击并拖动鼠标,就会将窗口拖动到周围。

我可以这样做吗?我必须实现多个事件吗?

4

5 回答 5

47

最适合我的解决方案是使用非托管代码,与 HatSoft 发布的答案不同,它可以为您提供平滑的窗口移动。

3 个小步骤在 Panel 移动中拖动窗口

using System.Runtime.InteropServices;

在你的类中添加这六行

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

并且 Panel 上的 MouseMove 事件应如下所示

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

发布的有点晚了 :) ,谁知道我们将来可能会再次需要它。

于 2013-10-21T09:53:13.403 回答
6

您可以通过使用面板的 MouseMove 事件来实现

示例应该是这样的(抱歉没有测试过)

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);
    }
}
于 2012-07-07T23:34:59.943 回答
1

您可能想看看我在这里粘贴的这个组件:

http://pastebin.com/5ufJmuay

它是一个组件,您可以将其放在表单上,​​然后通过在其中拖动来拖动表单。

于 2012-07-07T23:31:14.257 回答
0

当前设置为面板。VS C# Just Messing About 似乎对我有用,在按下左键时将应用程序的左上角设置为鼠标位置。

 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;
        }
    }
于 2021-01-27T00:32:08.340 回答
-1

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

于 2017-05-05T20:46:07.060 回答