Чтение онлайн

ЖАНРЫ

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

Трухильо Стэн

Шрифт:

void BmpViewWin::DrawScene {

 if (update_screen && bmpsurf) {

ClearSurface(backsurf, 0);

BltSurface(backsurf, bmpsurf, x, y);

primsurf->Flip(0, DDFLIP_WAIT);

update_screen=FALSE;

 }

}

Поскольку текущее положение поверхности рассчитывается в другом месте программы, а функция BltSurface при необходимости автоматически выполняет отсечение, функция DrawScene реализуется просто. Если переменная update_screen равна TRUE и существует

поверхность для вывода, экран обновляется. Если поверхность не заполняет экран целиком, содержимое вторичного буфера стирается; если заполняет, то в стирании буфера нет необходимости. Затем функция BltSurface копирует поверхность на вторичный буфер, а функция Flip отображает изменения на экране. После того как обновление будет завершено, переменной update_screen присваивается значение FALSE

Обработка пользовательского ввода 

Давайте посмотрим, как в нашей программе организована обработка ввода. Нажатые клавиши обрабатываются функций OnKeyDown, которая выглядит так:

void BmpViewWin::OnKeyDown(UINT key, UINT nRepCnt, UINT nFlags) {

 switch (key) {

 case VK_UP:

Up;

break;

 case VK_DOWN:

Down;

break;

 case VK_LEFT:

Left;

break;

 case VK_RIGHT:

Right;

break;

 case VK_HOME:

Home;

break;

 case VK_END:

End;

break;

 case VK_PRIOR:

PageUp;

break;

 case VK_NEXT:

PageDown;

break;

 case VK_ESCAPE:

 case VK_SPACE:

 case VK_RETURN:

ShowDialog;

break;

 }

 DirectDrawWin::OnKeyDown(key, nRepCnt, nFlags);

}

С первого взгляда на листинг OnKeyDown можно разве что понять, какие клавиши обрабатываются программой, потому что вся содержательная работа поручается другим функциям. Обратите внимание — при нажатии клавиш Escape, пробел и Enter вызывается одна и та же функция ShowDialog. Это облегчает вызов диалогового окна после вывода изображения.

Остальные восемь функций, вызываемых функцией OnKeyDown, изменяют положение поверхности во время прокрутки:

• Up

• Down

• Left

• Right

• Home

• End

• PageUp

• PageDown

Каждая из этих функций определяет положение поверхности по значениям переменных x, y, xlimit, ylimit, xscroll и yscroll. Код всех восьми функций приведен в листинге 5.9.

Листинг 5.9. Функции смещения поверхности

void BmpViewWin::Up(int inc) {

 if (!yscroll) return;

 if (y+inc<0) {

y+=inc;

update_screen=TRUE;

 } else {

y=0;

update_screen=TRUE;

 }

}

void BmpViewWin::Down(int inc) {

 if (!yscroll) return;

 if (y-inc>=ylimit) {

y-=inc;

update_screen=TRUE;

 } else {

y=ylimit;

update_screen=TRUE;

 }

}

void BmpViewWin::Left(int inc) {

 if (!xscroll) return;

 if (x+inc<0) {

x+=inc;

update_screen=TRUE;

 } else {

x=0;

update_screen=TRUE;

 }

}

void BmpViewWin::Right(int inc) {

 if (!xscroll) return;

 if (x-inc>=xlimit) {

x-=inc;

update_screen=TRUE;

 } else {

x=xlimit;

update_screen=TRUE;

 }

}

void BmpViewWin::Home {

 if (xscroll && x!=0) {

x=0;

update_screen=TRUE;

 }

 if (yscroll && y!=0) {

y=0;

update_screen=TRUE;

 }

}

void BmpViewWin::End {

 if (yscroll) {

y=-(bmprect.Height-displayrect.Height);

update_screen=TRUE;

 }

 if (xscroll) {

x=-(bmprect.Width-displayrect.Width);

update_screen=TRUE;

 }

}

void BmpViewWin::PageUp {

 if (yscroll) {

if (y-displayrect.Height>0) {

y-=displayrect.Height;

update_screen=TRUE;

} else {

y=0;

update_screen=TRUE;

}

 }

}

void BmpViewWin::PageDown {

 if (yscroll) {

if (y+displayrect.Height<=ylimit) {

y+=displayrect.Height;

update_screen=TRUE;

} else {

y=ylimit;

update_screen=TRUE;

}

 }

Поделиться с друзьями: