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


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



Давайте посмотрим, как в нашей программе организована обработка ввода. Нажатые клавиши обрабатываются функций 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; } } }


Обработчикам клавиш со стрелками (Up(), Down(), Left(), Right()) можно передать необязательный аргумент, который определяет шаг прокрутки. Как видно из определения класса BmpViewWin (см. листинг 5.5), по умолчанию шаг прокрутки равен 4.




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



Книжный магазин