секции оператора 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, которой передаются ширина и высота новой поверхности.
Функция UpdateRateMenuSurface отвечает за отображение текста меню. Выглядит она так:
BOOL SuperSwitchWin::UpdateRateMenuSurface {
RECT rect;
GetSurfaceRect(ratemenusurf, rect);
rect.left++;
rect.top++;
rect.right--;
rect.bottom--;
if (!ClearSurface(ratemenusurf, 0, 200, 132)) TRACE("first Clear failed\n");
if (!ClearSurface(ratemenusurf, 0, 128, 100, &rect)) TRACE("second Clear failed\n");
if (i==selectrate) SetTextColor(hdc, ratehighlightcolor);
else SetTextColor(hdc, ratetextcolor);
ExtTextOut(hdc, 10, i*12+17, 0, 0, buf, len, 0);
}
ratemenusurf->ReleaseDC(hdc);
return TRUE;
}
Прежде всего функция очищает поверхность, вызывая ClearSurface. Затем содержимое массива refresh_rates используется для вывода текстовых строк, связанных с каждым пунктом меню. Вывод текста, как обычно, осуществляется функцией GetDC интерфейса DirectDrawSurface в сочетании с текстовыми функциями Win32. Перед выходом из функции UpdateRateMenuSurface контекст устройства, полученный функцией GetDC, освобождается с помощью функции ReleaseDC.