730_________________________Часть V. Инструментарий программиста
// Сжатие прямоугольника rect.Inflate(-BAND_SIZE, -BAND_SIZE) ;
} while ((iSize -= 2*BAND_SIZE) > BAND_SIZE);
}
Начнем с изучения того, что происходит, когда окно получает сообщение от таймера. Внутри метода TimerTickO каждые 50 миллисекунд выполняется следующий код:
if (++usTickCount == 20) {
Invalidate(false);
usTickCount = 0;
}
Конечно, класс Rectswindow можно было бы запрограммировать так, чтобы изменение цвета и вывод новых прямоугольников происходили при каждом получении сообщения от таймера. Но на экране это выглядело бы как "цветовой взрыв" и у наблюдателя не было бы никакой возможности воспринять этот набор прямоугольников. Но если вы относитесь к числу любителей экзотики, то вы, разумеется, можете убрать из программы проверку значения переменной usTickCount.
Каждый раз при получении сообщения от таймера переменная usTickCount увеличивается и проверяется на кратность 20. Поскольку 20 сообщений' соответствуют 1 секунде, в этом случае производится перерисовка окна. Обратите внимание на то, что параметр, передаваемый в метод invalidate (), имеет значение false. Это значение сигнализирует OWL и Windows 95 о том, что фон нельзя обновлять прежде, чем окну будет передано сообщение paint (). В противном случае, поскольку алгоритм рисования охватывает всю область окна, вся работа Windows 95 по обновлению фона окна была бы потеряна.
Это подводит нас к рассмотрению обработчика сообщения paint ():
TRect rect = GetClientRect() ;
int iSize = min(rect.right, rect.bottom);
// Цикл пока прямоугольники не сделаются слишком маленькими do {
// Создание прямоугольника с кистью случайного цвета
dc.FillRect(rect, TBrush(RGB(random(255), random(255), random(255)))) ;
// Сжатие прямоугольника '
rect.Inflate(-BAND_SIZE, -BAND_SIZE);
} while ((iSize -= 2*BAND_SIZE) > BAND_SIZE) ;
Алгоритм рисования работает следующим образом: берется текущий размер окна и затем последовательно рисуются прямоугольники меньшего размера,