Вызов подобной функции рисования обычно выполняется при обработке полученного сообщения WMPAINT или по сообщениям таймера.

Кадрирование изображения библиотекой DirectX

При знакомстве с OpenGL рассматривались два варианта реакции графической системы на изменение окна - режим линзы и режим шторки. Действия OpenGL по умолчанию ближе к режиму шторки, а для автоматического изменения размеров изображения надо принимать специальные меры и переустанавливать область просмотра при каждом изменении окна. Кадрирование по умолчанию в DirectX имитирует режим линзы, но неудачно. Отличия операций кадрирования в DirectX и OpenGL проиллюстрированы рис. 23.1.

Как и OpenGL, DirectX в операции кадрирования использует область просмотра, заданную структурой D3DVIEWP0RT9 VP. Поля х, у структуры VP задают координаты верхнего левого угла области просмотра в системе активной страницы, a Width и Height - ее ширину и высоту в пикселах. Параметры области просмотра передаются в конвейер при помощи метода Device->SetViewport(&VP). Заполненный изображением канонический квадрат размером 2x2 отображаетВывод треугольников ся в прямоугольную область размером Width х Height. Если эта область выходит за пределы страницы, то канонический квадрат по-прежнему растягивается в прямоугольник Width х Height, но рисуется только та часть изображения, которая попадает в пересечение области вывода и активной страницы.

Кадрирование методом Present(NULL, NULL, NULL, NULL)

Рис. 23.1. Кадрирование методом Present(NULL, NULL, NULL, NULL)

Размеры активной страницы, создаваемой при помощи метода D3D->Create-Devi се( ), отличаются от размеров экрана и от размеров окна, дескриптор которого передается методу в структуре D3DPRESENT_PARAMETERS. Страница создается равной по размерам окну, только если заданы нулевые размеры в полях BackBufferWidth и BackBufferHeight структуры D3DPRESENT_PARAMETERS. Можно считать, что на невидимой странице задана система координат с началом в верхнем левом углу и с осями, направленными вправо и вниз. При смене страниц методом Present (NULL. NULL. NULL, NULL) в окно на экране отображается не область просмотра, а вся активная страница. Если она по размерам больше окна, то страница сжимается. Если же страница меньше окна, то она растягивается. Таким образом, изображение будет заполнять участок окна пропорционально части невидимой страницы, занятой областью просмотра.


⇐ Предыдущая| |Следующая ⇒