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) {