WinForm在客户端区域移动时不能平稳拖动

本文关键字:不能 拖动 移动 客户端 区域 WinForm | 更新日期: 2023-09-27 17:49:21

每当我在客户端区域通过某些组件(即标签)移动Windows窗体时,我最终会得到一个奇怪的鼠标偏移量,其中窗体不会在视觉上停留在光标下方。它仍然会根据我的鼠标在屏幕上的位置移动,但它会在光标位置的东南方向显著移动。

我必须自己指定一个负偏移量来抵消这个偏移量;我的代码如下:

private void component_MouseDown(object sender, MouseEventArgs e)
{
    if (sender is Label)
    {
        if (e.Button == MouseButtons.Left)
        {
             mouseLoc = new Point(-(e.X + OFFSET_X), -(e.Y + OFFSET_Y));
             isMouseDown = true;
        }
    }
}
private void component_MouseMove(object sender, MouseEventArgs e)
{
    if (isTitleLabelMouseDown)
    {
        Point p = Control.MousePosition;
        p.Offset(mouseLoc);
        Location = p;
    }
}
private void component_MouseUp(object sender, MouseEventArgs e)
{
    isMouseDown = false;
}

这个偏移确实解决了这个问题,但是什么让我陷入一个循环是为什么当我移动它的客户端区域时,表单的位置偏移摆在首位?

谢谢!

WinForm在客户端区域移动时不能平稳拖动

您似乎正在将客户端坐标转换为屏幕坐标。有更好的办法……

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.pointtoscreen%28v=vs.110%29.aspx

编辑:当然有更好的方法来做这件事。基本上,你想拦截更高层的点击,并告诉Windows点击实际上是在窗口标题中,这将导致Windows为你执行拖动…

Winforms -点击控件的wm_nchest消息