WinForm在按客户区移动时不能平滑拖动

时间:2015-05-17 02:17:57

标签: c# winforms

每当我通过客户区中的某个组件(即标签)移动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;
}

这个偏移确实解决了这个问题,但是什么引发了我的循环,这就是为什么当我首先通过客户区移动它时,表单的位置偏移?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

Winforms - WM_NCHITEST message for click on control