марта 31

Приложение со стандартным таймером

В качестве примера рассмотрим программу «Прыгающий мячик», в которой имитируется полет мяча в прямоугольном боксе от одной стенки к другой. Ударяясь о стенку бокса, мяч отскакивает под соответствующим углом и продолжает движение в новом направлении. Роль «бокса» в этой программе исполняет клиентская область окна приложения. Чтобы сделать пример более интересным, дополним его двумя требованиями: а) мяч должен вращаться во время движения; б) фон, на котором происходит полет мяча, должен изображать некоторую текстуру.
Контекст устройства в памяти1 (CreateCompatibleDC) для размещения в нем DDB-растра с изображением мяча (SelectObject) и последующего его вывода в контекст дисплея (BitBlt).
Обратите внимание на вызов функции SetGraphicsMode для переключения контекста устройства в графический режим (GM_ADVANCED). Этот режим нужен для использования мировой системы координат и мировых преобразований. В теле функции DrawBall мировые преобразования реализуются вызовом функции SetWorld-Transform, а изменяющиеся значения полей структуры xform обеспечивают эффект перемещения и вращения мяча. Эти преобразования должны использоваться только при выводе изображения мяча. Поэтому перед вызовом SetWorldTransform мы запоминаем текущее состояние контекста устройства с помощью Save DC, а затем восстанавливаем его вызовом RestoreDC. Основные события разворачиваются в блоке обработки сообщения WM_TIMER. Приведенный код вместе с комментариями, на наш взгляд, не требует дополнительных пояснений.