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) ;

Алгоритм рисования работает следующим образом: берется текущий размер окна и затем последовательно рисуются прямоугольники меньшего размера,