Вопрос

Я использую событие MouseMove для перемещения объектов (скажем, метки).

Простой принцип (схема):

OnMouseMove(e MouseEventArgs)
    if e.Button == Left
        deltaX = e.X - lastX
        foreach label in labels
            label.Location.X += deltaX
        lastX = e.X

После увеличения числа метков я начинаю видеть, как этикетки проходят вдоль движущейся траектории. У меня есть что -то вроде III III III II III III, но я хочу иметь что -то вроде IIII в качестве следа. Я хотел бы знать, когда мышь «начинается» и «останавливается, чтобы переместить» что -то подобное.

Я перемещаю этикетки вдоль горизонтального топора. MouseDown(Установите Lastx) и продолжайте. Никто не знает, когда останавливается, только мышь перемещают чувствительность. Конечно, я могу использовать MouseUp Чтобы знать, когда заканчивается движение, но, однако, если пользователь сохраняет кнопку вниз и прекратит движение, я хочу отразить последнюю позицию метки.

Есть ли способ предотвратить такие следы?

пытался

label.Visible = false
label.Location.X += deltaX
label.Visible = true

не помогает.

Parent.suspendlayout и Resumelayout не очень помогают, потому что мне нужно делать это при каждом движении мыши, так что любой эффект.

Это было полезно?

Решение

Редактировать: Я только что заметил ваше редактирование о том, когда мышь останавливается. Вы можете использовать таймер, чтобы помочь вам. Имейте один из них на интервал, который вы хотите обновить позиции и автозабрость, когда он истекает. Начните его на мышью и остановите на мыше. Когда таймер истекает, обновите местоположение метки.

--Оригинальный ответ для контекста:--

Да, вы можете приостановить рисунок на родительском управлении, переместить этикетки, а затем возобновить рисунок и обновить.

Из это так вопрос:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);

private const int WM_SETREDRAW = 11; 

public static void SuspendDrawing(Control parent)
{
    SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
}

public static void ResumeDrawing(Control parent)
{
    SendMessage(parent.Handle, WM_SETREDRAW, true, 0);
    parent.Refresh();
}

Пример использования:

private void OnMouseMove(MouseEventArgs e)
{
    int deltaX = e.X - lastX;
    // Suspend drawing here

    foreach (Label label in labels)
    {
        label.Location.X += deltaX;
    }

    lastX = e.X;
    // Resume drawing here
}

Редактировать: Если вы хотите показать изменение позиции только в том случае, если разница больше, чем N пикселей, то вам следует использовать теорему пифагорей, чтобы вычислить расстояние между старым положением и новой позицией и перемещать ее только в том случае, если разница больше n. Когда кнопка мыши поднимается, переместите этикетки в место, где они должны быть в соответствии с мышью.

Псевдокод:

difference = Math.Sqrt(x * x, y * y);

if (difference > n)  // n is whatever number you want
{
     // move the labels
     // set the old position to the new position
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top