Чтение онлайн

ЖАНРЫ

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

Трухильо Стэн

Шрифт:

 }

 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;

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 меню частот не отображается, мы вызываем функции CreateRateMenuSurface и UpdateRateMenuSurface и присваиваем флагу ratemenu_up значение TRUE. Давайте рассмотрим эти две функции. Функция CreateRateMenuSurface выглядит так:

BOOL SuperSwitchWin::CreateRateMenuSurface {

 if (ratemenusurf) ratemenusurf->Release, ratemenusurf=0;

 int rates=refresh_rates[selectmode].GetSize;

 ratemenusurf=CreateSurface(80, rates*12+22);

 return TRUE;

}

Сначала эта функция освобождает существующую поверхность (если таковая была создана ранее). Затем она определяет количество частот для выделенного в меню видеорежима и рассчитывает по ним размеры поверхности меню частот. Поверхность создается версией CreateSurface, которой передаются ширина и высота новой поверхности.

Поделиться с друзьями: