Графические конструкции иногда требуется рассматривать динамически в процессе их построения. Поэтому зачастую используется такая схема вывода графики:
1. Вывод графического элемента;
2. Задержка на n миллисекунд;
3. Повторение 1 и 2 этапа до вывода всех графических элементов.
Реализация задержки с помощью таймера возможна следующим способом:
// Глобальное поле flag
private bool flag = false;
...
// Далее следует часть программы,
// где необходимо организовать задержку
// Включаем таймер
timer1.Enabled = true;
// Устанавливаем flag в значение true
flag = true;
// Организуем бесконечный цикл
while (flag);
// Выключаем таймер после выхода из цикла
timer1.Enabled = false;
// Обработчик тика таймера
private void timer1_Tick_1(object sender,
EventArgs e)
{
// Сбрасываем flag в значение false
flag = false;
}
Идея данного подхода заключается в организации бесконечного цикла, который будет проверять значение некого флага. Однако значение флага может измениться при наступлении события Tick таймера, то есть через заданный в таймере промежуток времени. Однако бесконечный цикл, описанный выше, останется бесконечным и программа просто зависнет. В чем же дело? Дело в том, что при такой организации цикла программа не может опросить очередь сообщений, в которое и будет поступать, в том числе, и событие Tick от таймера. Тем самым мы не попадем никогда в обработчик события timer1_Tick_1. Что бы решить данную проблему надо в теле цикла написать Application.DoEvents(), что фактически будет заставлять приложение опрашивать очередь сообщений и в свою очередь приведет к срабатыванию обработчика события timer1_Tick_1.
Перед выполнением индивидуального задания по лабораторной работе, разработайте приложение строящее ряд увеличивающихся квадратов (рис. 15.2). Квадраты выводятся последовательно через одну секунду.