Графические конструкции иногда требуется рассматривать дина- мически в процессе их построения. Поэтому зачастую используется та- кая схема вывода графики:
Вывод графического элемента.
Задержка на n миллисекунд.
Повторение 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.
Перед выполнением индивидуального задания по лабораторной ра- боте разработайте приложение, строящее ряд увеличивающихся квадра- тов (рис. 14.2). Квадраты выводятся последовательно через одну секунду.
Достарыңызбен бөлісу: |