728___________________________Часть V. Инструментарий программиста

изменению их размеров, программа минимизирует (но все же не полностью) это мерцание.

Функция SetupWindow () завершается посылкой сообщения, "напоминающего" самому себе разместить окна. Это необходимо сделать, поскольку объект DemoMDiwindow должен быть полностью проинициализирован, прежде чем он сможет обработать запрос TileChildren (). К тому времени, когда вызвана cmshowchildren (), приложение знает, что объект DemoMDiwindow жив и здоров и окна уже не спрятаны, поэтому их можно разместить, причем так, чтобы каждое получило одинаковое расположение на экране (это, кроме всего, еще и весьма демократичная программа).

Теперь, когда мы обсудили структуру и логику программы, можно переходить к самому интересному — применению GDI.

Прямоугольные окна

Листинг 25.3 содержит заголовочный файл для класса Rectwindow. Как и остальные графические классы для окон программы, в его задачу входит, в основном, только реакция на сообщения paint () и таймера. Это отражается и в его достаточно коротком определении.

#ifndef RECTS__H

#define RECTS_H

// Необходимые файлы ftinclude "base.h"

// Определение нашего класса class RectsWindow : public BaseWindow {

public:

// Конструктор RectsWindow() ;

// Обработчики сообщений void TimerTickO;

void Paint(TDC& dc, bool, TRectS);

protected:

// Обработчик сообщения WM_SIZE void EvSizelUINT, TSizes Size);

private:

// Переменная-счетчик сигналов от таймера unsigned short usTickCount;

DECLARE_CASTABLE ;

DECLARE_RESPONSE_TABLE(RectsWindow) ;

};

#endif