Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使mousedrag在面板内移动窗体窗口?_C#_Winforms - Fatal编程技术网

C# 如何使mousedrag在面板内移动窗体窗口?

C# 如何使mousedrag在面板内移动窗体窗口?,c#,winforms,C#,Winforms,我有一个要启用的System.Windows.Forms.Panel,这样,如果用户单击并拖动鼠标,就会将窗口拖动到 我能做这个吗?我必须实现多个事件吗?您可能想看看我粘贴在这里的这个组件: 它是一个组件,您可以将其放置在窗体上,然后通过在窗体内拖动来拖动窗体。您可以使用面板的MouseMove事件来实现它 示例应该是这样的(很抱歉没有测试它) 最适合我的解决方案是使用非托管代码,它提供了平滑的窗口移动,这与HatSoft发布的答案不同 3个小步骤,在面板移动时拖动窗口 在你的课堂上加上这六行

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


我能做这个吗?我必须实现多个事件吗?

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


它是一个组件,您可以将其放置在窗体上,然后通过在窗体内拖动来拖动窗体。

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

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


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

3个小步骤,在面板移动时拖动窗口

在你的课堂上加上这六行

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();
面板上的MouseMove事件应该是这样的

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

发布得有点晚:),谁知道我们将来可能还会需要它。

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

当前为面板设置。VS C#只是胡闹对我来说似乎是我想要的 按下鼠标左键时,将应用程序左上角设置为鼠标位置

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

使用面板的MouseMove事件<代码>常量int WM_nclubuttondown=0x00A1哦,是的,我错过了,谢谢你指出这一点。:)更新了我的答案这应该被选为被接受的答案。工作起来很有魅力。当前接受的答案有一些小问题,但在解决此问题时会提示要采取的方法。使用多个屏幕时,接受的答案会导致问题。这应该是公认的答案。易于实现且非常平滑这是一个非常完美的解决方案。另一个被接受的解决方案是闪烁。这很顺利。您也可以将此功能赋予面板上的标签和其他控件。在我的例子中,面板上没有可拖动的空间。因此,我在Events选项卡中为labels提供了相同的函数。
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
   if (e.Button == MouseButtons.Left)
   {
      ReleaseCapture();
      SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
   }
}
 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;
        }
    }