Глава 25. Графический интерфейс устройства_______________________727
Метод SetTimerO создает таймер, который каждые 50 миллисекунд посылает сообщение приложению. Когда такое сообщение получено, OWL перехватывает его И Отправляет обработчику EvTimer () ДЛЯ DemoMDIWindow.
Все графические классы наследуются от общего базового класса Basewindow. Класс Basewindow полностью определяется в заголовочном файле base.h (не ищите такого .срр файла, его нет). Поскольку этот класс не поддерживает ничего, кроме формализации интерфейса, соответствующий заголовочный файл здесь не приводится. Классы, производные от Basewindow, содержат метод TimerTickO, который вызывается каждый раз, когда приложение получает сообщение таймера.
Как же сообщение от обработчика EvTimer () становится доступным каждому из методов TimerTick () ? Очень просто. В EvTimer () можно найти следующую строку:
ForEach(ChildTimers, 0) ;
Вызов этого метода заставляет OWL перебрать все дочерние окна и вызвать для каждого из них метод childTimers (). В свою очередь chiidTtmers () приведет тип указателя окна к типу Basewindow и затем вызовет метод
TimerTrick(.) ЭТОГО ОКНВ.
Таким образом поддерживается работа таймера, но необходимо еще и создать дочерние окна. Сразу после того, как таймер инициализирован в Setupwindow (), DemoMDiwindow создает экземпляры каждого из трех классов
демонстрационных ОКОН (RectsWindow, ShapesAndFillsWindow И SmileyWindow).
Указатели на эти окна хранятся в массиве, поэтому программа может легко и единообразно ими манипулировать. После создания экземпляров окон к каждому из них применяется следующий код:
for (int iLoop =0; iLoop < 3; iLoop++) (
Children[iLoop]->Attr.Style &= ~(WS_VISIBLE ¦
WS_SYSMENU ¦
WS_MINIMIZEBOX ¦
WS_MAXIMIZEBOX) ;
Children!iLoop]->Attr.Style 1= WS_DISABLED;
Children[iLoop]->Create();
Программа модифицирует биты, определяющие стиль окон так, что перво-' начально созданные окна оказываются невидимыми, неактивными и не имеющими стандартных элементов управления. Окна создаются невидимыми, потому что приложение будет размещать три окна внутри клиентской области DemoMDiwindow, и эта операция не может быть моментально завершена. Если бы окна сразу создавались видимыми и затем уже размещались, на экране проявлялось бы заметное мерцание во время перемещения окон или изменения их размеров. Пряча окна до нужного момента, когда они готовы к