Графика для 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 меню частот не отображается, мы вызываем функции