如何使窗口可拖动(C# Winforms)?

Posted

技术标签:

【中文标题】如何使窗口可拖动(C# Winforms)?【英文标题】:How to make a window Draggable(C# Winforms)? 【发布时间】:2011-04-29 01:02:34 【问题描述】:

我有形式。我已启用表单的透明度,并删除了它的标题栏和边框。在里面,我创建了一个自定义 UI,它具有与窗口相同的功能。基本上,我的想法是创建自定义窗口。

一切都按预期工作,但只有窗口拖动不起作用。我不确定如何启用它。我用谷歌搜索了这个。但我没有找到任何对我有用的信息。

请帮我实现这个窗口拖动。

【问题讨论】:

关于mouse 事件.... ??尝试使用mouse 事件来移动窗口。 默认的 winform 行为是通过您删除的标题栏拖动窗口。请注意,当用户看到无栏窗口时,他们不太可能拖动和移动它。如果您仍然想要这个,您必须自己实现它,例如使用 Cyril 的回答中提供的解决方案。 Move a window on keypress + mouse (like linux ALT + mouse down)的可能重复 Winforms - Click/drag anywhere in the form to move it as if clicked in the form caption的可能重复 【参考方案1】:

我已通过捕获 mousedown(在 mouseup 时取消捕获)然后 mousemove 来实现此行为。

只需移动窗体坐标(左、上),相当于鼠标移动的量(这些事件具有鼠标移动的量)。

这对我来说很好。

【讨论】:

【参考方案2】:
class YourForm : Form

     private const int WM_NCHITTEST = 0x84;
     private const int HTCLIENT = 0x1;
     private const int HTCAPTION = 0x2;

     ///
     /// Handling the window messages 
     ///
     protected override void WndProc(ref Message message)
     
          base.WndProc(ref message);

          if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT)
               message.Result = (IntPtr)HTCAPTION;
     

【讨论】:

【参考方案3】:

最简单的方法是处理WM_NCHITTEST 消息并为自定义窗口的部分返回HTCAPTION,这些部分的工作方式与普通窗口中的标题栏一样。 Windows 将完成剩下的工作。

【讨论】:

以上是关于如何使窗口可拖动(C# Winforms)?的主要内容,如果未能解决你的问题,请参考以下文章

WPF C#如何使用鼠标使控件可拖动

c# WINFORM窗体如何设置才可以不能随意拖动大小

如何使用户控件像窗口一样在屏幕上可拖动

如何使用拇指使 WPF 弹出窗口可拖动?

为啥这个 WinForms 窗口在拖动时会呈现工件?

C# WinForms 用鼠标拖动控件