C# Анимация изменения размера WinForm

Формы Windows Forms

Одной из замечательных особенностей форм Windows Forms в .NET является их гибкость. Разработчики часто разрешают пользователям легко изменять размеры форм Windows Forms. В действительности многим разработчикам бывает необходимо изменять размер формы Windows Forms программным образом.

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

В этой статье мы будем изучать анимацию изменения размера, что гораздо больше того, что делает калькулятор Windows.

Анимация WinForm

Анимация в приложениях C# представляет интересную тему, которая подробно рассмотрена. В данном частном случае мы собираемся использовать вместе несколько концепций для достижения практического использования анимации в формах Windows Forms. (Слово "практический", конечно, зависит от конкретного случая).

Говоря более конкретно, анимация в данном случае будет использоваться для показа плавного перехода формы от одного размера к другому (по ширине и высоте). На этот раз мы не будем рассматривать изображения анимации.

Изменение размеров форм

Предположим, у нас есть форма Windows Forms шириной в 250 пикселей и высотой в 300 пикселей (250 x 300). По некоторым причинам нам нужно программно установить ширину и высоту как 200 x 200. Наиболее очевидный и прямой способом сделать это:

this.Width = 200;

this.Height = 200;

Очень понятно и очень просто, не так ли?

Да, во многих случаях этого достаточно. Но во время выполнения изменение от 250 x 300 до 200 x 200 будет слишком резким. Если нам нужно анимировать плавный переход к другому размеру, необходимо применять другой подход.

Чтобы создать впечатление, что изменение анимируется, нам необходимо много раз уменьшать ширину и высоту небольшими интервалами, пока не будет достигнут новый размер.

Далее приводится очень, очень простая реализация этой концепции:

while (this.Width > 200)
{
    this.Width--;
    Application.DoEvents(); //allow the Form to display its new size before
                            //the next iteration
}
 
while (this.Height > 200)
{
    this.Height--;
    Application.DoEvents();
}

Это и есть вся идея. Все следующее отсюда — технические детали реализации. Давайте пройдем по некоторым моментам, которые необходимо предусмотреть.

  • Приведенный выше код сначала изменяет ширину, а затем высоту. Нам нужно изменять оба размера одновременно.
  • Код должен работать в обоих направлениях (увеличения или уменьшения размера) независимо от ширины и высоты.
  • Как быстро это будет работать? Мы хотим, чтобы анимация работала с постоянной скоростью в разных системах.
  • Этот код однопотоковый, более интеллектуальный подход заключается в использовании отдельного потока, выделенного для обновлений пользовательского интерфейса.
  • Наконец, нам необходимо, чтобы этот код работал для любой формы (а не только той, на которую указывает "this").