Графика для Windows средствами DirectDraw


Графический вывод


Как и в полноэкранном варианте, для обновления экрана класс DirectDrawWin вызывает функцию DrawScene(). Ее реализация для оконных приложений отличается от полноэкранного варианта по двум причинам. Во-первых, поскольку в оконном приложении не выполняется переключение страниц, содержимое вторичного буфера приходится копировать на первичную поверхность. Во-вторых, местонахождение выводимых данных на первичной поверхности должно определяться текущим положением и размерами окна. Помните — первичная поверхность в данном случае изображает весь экран, а не только клиентскую область окна. Оконный вариант DrawScene() выглядит так:


void BounceWin::DrawScene() { ClearSurface( backsurf, 0 ); CRect client=GetClientRect(); int width=client.Width(); int height=client.Height(); x+=xinc; y+=yinc; if (x<-160 || x>width-160) { xinc=-xinc; x+=xinc; } if (y<-100 || y>height-100) { yinc=-yinc; y+=yinc; }

BltSurface( backsurf, surf1, x, y );

int offsetx=client.left; int offsety=client.top;

RECT srect; srect.left=0; srect.top=0; srect.right=client.Width(); srect.bottom=client.Height();

RECT drect; drect.left=offsetx; drect.top=offsety; drect.right=offsetx+client.Width(); drect.bottom=offsety+client.Height();

primsurf->Blt( &drect, backsurf, &srect, DDBLT_WAIT, 0 ); }


Функция DrawScene() выполняет две блит-операции. Первая копирует содержимое поверхности surf1 на внеэкранную поверхность, которая используется в качестве вторичного буфера. Обратите внимание на применение функции BltSurface(), рассмотренной нами выше. Автоматическое отсечение, выполняемое BltSurface(), позволяет произвольно выбирать позицию на поверхности surf1.

Вторая блит-операция копирует содержимое вторичного буфера на первичную поверхность. На этот раз используется функция Blt(), поскольку к первичной поверхности присоединен объект отсечения. Структуры srect и drect типа RECT определяют области источника и приемника, участвующие в блиттинге. Заметьте, что при вычислении области приемника используются переменные offsetx и offsety, в которых хранятся координаты клиентской области окна. Если убрать эти смещения из структуры drect, программа всегда будет выводить изображение в левом верхнем углу экрана независимо от расположения окна.




Начало  Назад  Вперед