Мыслима чувствительность
Вопрос
Я использую событие 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
}