Drag and Drop - перемещение метки в Winforms - PullRequest
0 голосов
/ 23 декабря 2011

Я создал переопределение метки, которое позволит легко перемещать мой новый элемент управления по экрану.

Я прикрепил приведенный ниже код, но когда я запускаю приложение или пытаюсь переместить метку, она всегда выключена. Это также иногда просто полностью исчезнет, ​​оставит след или вернется в положение 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 ]

5 голосов
/ 23 декабря 2011

Код 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);
}

На снимке экрана также видно, что форма перерисовывается неправильно.Вы не оставили ни малейшего понятия о том, что может вызвать это.

0 голосов
/ 23 декабря 2011

У меня недавно была такая проблема, и я решил ее, установив цвет фона метки на Color.Transparent.

Если это не решит проблему, вам следует рассмотреть возможность обработки событий. Возможно, вы регистрируете более одного события перемещения мыши, и поэтому каждый метод будет мешать другому.

РЕДАКТИРОВАТЬ:

Вы также пытались переопределить метод OnPaint его родительского класса?

protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
        }
0 голосов
/ 23 декабря 2011

Может быть, вы должны сосредоточиться на своем элементе, как

label1.Focus();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...