Иногда бывает полезна психологическая разгрузка. Добавим в класс Form1 метод, который будет вызываться при возникновении некоторого события, например, клика на форме. Тогда в течении некоторого времени в окне формы можно будет наблюдать заход Луны. Первая реакция пользователя — компьютерный вирус. Однако все последствия от его действия — перекраска фона формы (добавка двух операторов позволит избежать и этих последствий).
Идея алгоритма состоит в том, чтобы внутри обработчика старшего события (клика на форме) выполнялась анимация (заход Луны) в течение нескольких секунд. Для этого удобно использовать динамически создаваемый таймер, задающий частоту кадров анимации (как в примере с бильярдными шарами). Каждое срабатывание таймера (такт) назовем младшим событием. Выключение таймера будет выполнено через заданное число тактов.
Младшее событие timer.Tick свяжем через обобщенный делегат EventHandler с лямбда-выражением (разновидность анонимной функции).
Тогда вместо объявления функции обработчика этого события мы можем использовать следующую конструкцию:
timer.Tick += new EventHandler((o, ev) =>
{
// обработка младшего события — составное лямбда-выражение
});
Здесь «=>» — лямбда-оператор, связывающий анонимный метод (функцию) с лямбда-выражением.
Обработка старшего события (клика на форме)зададим следующим образом:
1) Создаем объект timer через конструктор класса Timer. Задаем свойство Interval = 40 мс (25 кадров в секунду).
2) Задаем счетчик перемещений и максимальное число кадров.
3)Задаем начальное положение и диаметр шара — Луны.
4) Задаем настройки графики: холст, его очистку, стиль и цвет кистей для рисования Луны и фона.
5) Рисуем шар в начальном положении.
6) Внутри скобок { } :
timer.Tick += new EventHandler((o, ev) =>
{
удаляем шар, изменяем его координаты, рисуем шар снова; считаем число перемещений, если оно максимальное, то останавливаем таймер.
}
);
7) Запускаем таймер.
Ниже приведен текст метода Form1_Click() с использованием этой конструкции:
private void Form1_Click(object sender, EventArgs e) { Timer timer = new Timer(); // объект - таймер timer.Interval = 40; // тик - каждые 40 миллисекунд int count = 0; // счетчик перемещений int max = 150; // их максимальное число int x = 20; // начальные int y = 20; // координаты int d = 60; // диаметр шара Graphics g = this.CreateGraphics(); // объект - на форме g.Clear(Color.DarkCyan); // очистка цветом фона SolidBrush br = new SolidBrush(Color.Yellow); // задание кисти SolidBrush brf = new SolidBrush(Color.DarkCyan); // задание фона g.FillEllipse(br, x, y, d, d); // заливка - начало // Каждые 40 мс будет удаляться и рисоваться новый шарик, остановка через 150 раз timer.Tick += new EventHandler((o, ev) => { g.FillEllipse(brf, x, y, d, d); x += 5; y += 2; g.FillEllipse(br, x, y, d, d); count++; if (count == max) timer.Stop(); } ); timer.Start(); // запустили, остановится сам }
Результат: Кликнув 3 раза на форме, вы сможете наблюдать заход 3-х Лун.
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
![]() |
![]() |
![]() |
![]() |