拖放 - 在Winforms中移动标签

时间:2011-12-23 10:30:23

标签: c# winforms

我创建了一个标签覆盖,可以让我的新控件轻松地在屏幕上移动。

我已经附上了下面的代码,但是当我运行应用程序或尝试移动标签时,它总是关闭。它有时也会完全消失,留下痕迹或重置到0,0位置。看一下截图。

我过去常常让这个工作100%,但经过最近的一些调整之后它再次出现在狗身上,我不知道如何让它发挥作用。

截图: Attempting to Drag

代码:

internal sealed class DraggableLabel : Label
{

    private bool _dragging;
    private int _mouseX, _mouseY;

    public DraggableLabel()
    {
        DoubleBuffered = true;
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
      if (_dragging)
        {
            Point mposition = PointToClient(MousePosition);
            mposition.Offset(_mouseX, _mouseY);

            Location = mposition;
        }
        base.OnMouseMove(e);
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
       if (e.Button == MouseButtons.Left)
        {
           _dragging = true;
           _mouseX = -e.X;
           _mouseY = -e.Y;
           BringToFront();
           Invalidate();
        }
        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (_dragging)
        {
            _dragging = false;
            Cursor.Clip = new Rectangle();
            Invalidate();
        }

        base.OnMouseUp(e);
    }

}

3 个答案:

答案 0 :(得分:5)

OnMouseMove()代码不好。这样做是这样的:

private Point lastPos;

protected override void OnMouseMove(MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
        int dx = e.X - lastPos.X;
        int dy = e.Y - lastPos.Y;
        Location = new Point(Left + dx, Top + dy);
        // NOTE: do NOT update lastPos, the relative mouse position changed
    }
    base.OnMouseMove(e);
}

protected override void OnMouseDown(MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
        lastPos = e.Location;
        BringToFront();
        this.Capture = true;
    }
    base.OnMouseDown(e);
}

protected override void OnMouseUp(MouseEventArgs e) {
    this.Capture = false;
    base.OnMouseUp(e);
}

屏幕截图还显示表格没有正确重绘的证据。你没有留下任何可能导致这种情况的线索。

答案 1 :(得分:0)

我最近遇到了这样的问题,我通过将标签的背景颜色设置为Color.Transparent来解决它。

如果这不能解决问题,那么您应该考虑监控事件处理。可能是您正在注册多个鼠标移动事件,因此每个方法都会干扰另一个。

编辑:

您是否也尝试覆盖其父类的OnPaint方法?

protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
        }

答案 2 :(得分:-1)

也许你应该把重点放在你的元素上,比如

label1.Focus();