MouseMove чувствительность - PullRequest
5 голосов
/ 23 марта 2010

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

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

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

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

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

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

пытался

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

не помогает.

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

1 Ответ

2 голосов
/ 23 марта 2010

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

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

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

С этот ТАК вопрос :

[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
}
...