Редактировать: Я только что заметил ваше редактирование о том, когда мышь останавливается. Вы можете использовать таймер, чтобы помочь вам. Имейте один установленный интервал, на котором вы хотите обновить позиции и автоматический сброс, когда он истекает. Запустите его мышкой вниз и остановите мышкой вверх. По истечении таймера обновите расположение меток.
- Оригинальный ответ для контекста: -
Да, вы можете приостановить рисование на родительском элементе управления, переместить метки, а затем возобновить рисование и обновить.
С этот ТАК вопрос :
[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
}