Трухильо Стэн
Шрифт:
if (ratemenu_up) {
DWORD w,h;
GetSurfaceDimensions(ratemenusurf, w, h);
backsurf->BltFast((320-w)/2, (200-h)/2, ratemenusurf, 0, DDBLTFAST_WAIT);
}
UpdateFPSSurface;
if (displayfps) {
int x=displayrect.right-fpsrect.right;
int y=displayrect.bottom-fpsrect.bottom;
backsurf->BltFast(x, y, fpssurf, &fpsrect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
}
primsurf->Flip(0, DDFLIP_WAIT);
}
Код, отображающий меню частот, расположен внутри кода меню видеорежимов (потому что меню частот выводится поверх меню видеорежимов). Присутствие меню частот определяется состоянием флага ratemenu_up. При выводе поверхность меню частот выравнивается по центру поверхности меню видеорежимов.
Обработка пользовательского ввода
Теперь в программу необходимо включить код для обработки пользовательского ввода при работе с меню частот. Мы воспользуемся функцией OnKeyDown (листинг 4.7).
Листинг 4.7. Функция SuperSwitch::OnKeyDown
void SuperSwitchWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
int newindex;
int nmodes=GetNumDisplayModes;
if (nmodes>maxmodes) nmodes=maxmodes;
int rows=nmodes/menucols;
if (nmodes%menucols) rows++;
switch (nChar) {
case VK_ESCAPE:
if (!include_refresh || !ratemenu_up) {
PostMessage(WM_CLOSE);
break;
}
if (ratemenu_up) {
ratemenu_up=FALSE;
if (ratemenusurf) ratemenusurf->Release, ratemenusurf=0;
}
break;
case VK_UP:
if (include_refresh && ratemenu_up) {
if (selectrate>0) {
selectrate--;
UpdateRateMenuSurface;
}
} else {
newindex=selectmode-1;
if (newindex>=0) {
selectmode=newindex;
UpdateModeMenuSurface;
}
}
break;
case VK_DOWN:
if (include_refresh && ratemenu_up) {
if (selectrate<numrates-1) {
selectrate++;
UpdateRateMenuSurface;
}
} else {
newindex=selectmode+1;
if (newindex>nmodes) {
selectmode=newindex;
UpdateModeMenuSurface;
}
}
break;
case VK_LEFT:
if (include_refresh && ratemenu_up) break;
newindex=selectmode-rows;
if (newindex>=0) {
selectmode=newindex;
UpdateModeMenuSurface;
}
break;
case VK_RIGHT:
if (include_refresh && ratemenu_up) break;
newindex=selectmode+rows;
if (newindex<nmodes) {
selectmode=newindex;
UpdateModeMenuSurface;
}
break;
case VK_RETURN:
if (include_refresh) {
if (ratemenu_up) {
int rate=refresh_rates[selectmode][selectrate];
ActivateDisplayMode(selectmode, rate);
x=y=0;
ratemenu_up=FALSE;
} else {
CreateRateMenuSurface;
UpdateRateMenuSurface;