Графика для Windows средствами DirectDraw | страница 89
>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
> 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
> 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();
> ratemenu_up=TRUE;
> }
> } else {
> if (selectmode!=GetCurDisplayMode()) {
> ActivateDisplayMode(selectmode);
> x=y=0;
> }
> }
> break;
> case 'S':
> SaveSurface(primsurf, "SuperSwitch.bmp");
> break;
> default:
> DirectDrawWin::OnKeyDown(nChar, nRepCnt, nFlags);
> }
>}
Все case-секции оператора switch были изменены для работы с новым меню. При нажатии клавиши Escape программа по-прежнему завершает работу, если меню частот в данный момент не отображается; тем не менее, если меню присутствует на экране, клавиша Escape просто скрывает его. Действие клавиш со стрелками также зависит от состояния меню. Если меню частот отображается, стрелки и изменяют выделенную частоту, а если нет — выделенный пункт в меню видеорежимов.
Самые существенные различия связаны с обработкой клавиши Enter. Если во время нажатия клавиши Enter меню частот не отображается, мы вызываем функции