通过单击拖动控件来移动窗口

6

我有一个WinForms项目,在窗口的顶部有一个面板。我希望当用户点击并拖动该面板时,能够移动窗口。

我该如何实现这个功能?


1
谷歌说这可能是重复的:https://dev59.com/1nVD5IYBdhLWcg3wR5go - rie819
2
不是的。我不希望用户能够在窗体中任意移动窗口。我只想让用户能够从“panel1”控件中移动窗口。 - Victor
2
在谷歌上搜索“Daniel Moth,Vista Glass”。我知道他的教程会向您展示一种方法,可以通过Win32调用来实现这一点。此外,这可能会引起一些兴趣:http://www.codeproject.com/Articles/55180/Extending-the-Non-Client-Area-in-Aero - Matthew Layton
1
窗口是否有标题栏? - Blachshma
那么窗口应该通过从标题栏和面板拖动来移动,是吗? - Blachshma
1个回答

19

将以下声明添加到您的类中:

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HTCAPTION = 0x2;

[DllImport("User32.dll")]
public static extern bool ReleaseCapture();

[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

将以下代码放在您面板的 MouseDown 事件中:

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

1
太棒了!+1 避免了抽象化的尝试,试图通过数学方法来计算光标位置、偏移量等等... 但是不,这个人直接冲进建筑物里,拿到了冰淇淋蛋卷,并且接入了窗口消息系统。太好了!谢谢你。 - Leo Gurdian

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