C# 用鼠标拖动无边框窗口窗体
可能重复:C# 用鼠标拖动无边框窗口窗体,c#,winforms,drag,C#,Winforms,Drag,可能重复: 我通过设置 this.FormBorderStyle=FormBorderStyle.None 现在,问题是如何用鼠标拖动它?您必须注册MouseDown、MouseUp和MouseMove事件,并根据鼠标的移动来移动窗体。这应该是您正在寻找的 正如博文所说,这是一种“愚弄”系统的方式。这样,您就不必考虑鼠标上/下事件。请记住,作为一种副作用,双击窗口会使窗口最大化。不会导致这个问题。我可以只在某些部分拖动它吗?使用控制区域也会杀死鼠标右键。对不起,这是一个可怕的解决方案。它终止了
我通过设置
this.FormBorderStyle=FormBorderStyle.None代码>
现在,问题是如何用鼠标拖动它?您必须注册MouseDown、MouseUp和MouseMove事件,并根据鼠标的移动来移动窗体。这应该是您正在寻找的
正如博文所说,这是一种“愚弄”系统的方式。这样,您就不必考虑鼠标上/下事件。请记住,作为一种副作用,双击窗口会使窗口最大化。不会导致这个问题。我可以只在某些部分拖动它吗?使用控制区域也会杀死鼠标右键。对不起,这是一个可怕的解决方案。它终止了右键单击,双击表单上的任意位置可使其最大化。。。这已经比它的价值更麻烦了-当你完成修复最大化和右键点击杀手问题时,可能已经实现了mouseDown/mouseUp和mouseMove事件。仅供参考,答案中的链接已失效-“jachman.wordpress.com不再可用。作者已删除此网站。”如果有一个代码示例,这个答案会更有价值。基于鼠标坐标移动表单的数学不是很简单。
public partial class MyDraggableForm : 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;
}
public MyDraggableForm()
{
InitializeComponent();
}
}