Вопрос

Есть ли какое-либо событие в С#, которое срабатывает, когда форма ОСТАНАВЛИВАЕТ перемещение.Не во время движения.

Если для этого нет события, есть ли способ сделать это с помощью WndProc?

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

Решение

Событие ResizeEnd срабатывает после завершения перемещения.Возможно, вы могли бы использовать это.

Другие советы

Это не отказоустойчивое решение, но это чистый .NET и очень простой.Добавьте таймер в свою форму, установите для него относительно короткую задержку (100-150 мс мне показались приемлемыми).Добавьте следующий код для событий Form.LocationChanged и Timer.Tick:

private void Form_LocationChanged(object sender, EventArgs e)
{
    if (this.Text != "Moving")
    {
        this.Text = "Moving";
    }
    tmrStoppedMoving.Start();
}

private void Timer_Tick(object sender, EventArgs e)
{
    tmrStoppedMoving.Start();
    this.Text = "Stopped";
}

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

Просто установите флаг в значение true, когда запускаются события onmove.Если происходит событие mouseup и флаг имеет значение true, форма перестает перемещаться.

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

У меня была та же проблема с пользовательским элементом управления, но у него нет события ResizeEnd.Решение, которое сработало, состоит в том, чтобы переопределить метод WndProc и прослушивать EXITSIZEMOVE.

См. пример здесь

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top