用鼠标拖动无边框窗体

6

可能重复:
C# - 如何使无边框窗体可移动?

我已经通过设置

this.FormBorderStyle = FormBorderStyle.None;

来制作了一个没有边框的 C# 窗体。现在问题是如何用鼠标拖动它?

2个回答

23

这应该就是你要找的"增强版:无需标题栏即可拖动和移动WinForms"

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();
    }
}
根据博客文章所述,这是一种“愚弄”系统的方法。这样,您就不需要考虑鼠标上/下事件。

3
请记住,作为一个副作用,双击窗口将使窗口最大化。这个答案不会引起这个问题。 - ghord
我可以仅在特定区域内使其可拖动吗?例如在控件区域内。 - Thunder
它还会禁用鼠标右键。 - TaW
很抱歉,但这是一个可怕的解决方案。它禁用了右键点击,在表单的任何位置双击都会最大化它...这已经比它值得的麻烦更多了 - 在你修复最大化和右键点击问题之前,可能已经实现了mouseDown/mouseUp和mouseMove事件。 - SE13013
1
请注意,答案中的链接已失效 - “jachman.wordpress.com不再可用。作者已删除此网站。” - Pang

2

您需要注册MouseDown、MouseUp和MouseMove事件,并根据鼠标的移动来移动窗体。


1
这个答案如果有代码示例会更有价值。根据鼠标坐标移动表单的数学计算并不是简单的。 - servermanfail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接