Графика для Windows средствами DirectDraw | страница 88
> DWORD h=desc->dwHeight;
> DWORD d=desc->ddpfPixelFormat.dwRGBBitCount;
> DWORD r=desc->dwRefreshRate;
> SuperSwitchWin* win=(SuperSwitchWin*)p;
> int index=win->GetDisplayModeIndex(w, h, d);
> win->refresh_rates[index].Add(r);
> return DDENUMRET_OK;
>}
Функции StoreModeInfo()> передается указатель на структуру DDSURFACEDESC с описанием очередного видеорежима. В описание входит частота смены кадров (поле dwRefreshRate), а также размеры, по которым определяется индекс режима. Затем этот индекс используется для сохранения частоты видеорежима в массиве.
После выхода из функции OnCreate() класс DirectDrawWin вызывает функцию CreateCustomSurfaces(). По сравнению с программой Switch эта функция не изменилась; она по-прежнему создает три поверхности, потому что новая поверхность (ratemenusurface) создается только в случае необходимости.
Давайте посмотрим, как в программе SuperSwitch реализована функция DrawScene(). Она похожа на одноименную функцию из программы Switch, за исключением того, что при выборе видеорежима новая версия должна отображать поверхность со списком частот. Функция DrawScene() выглядит так:
>void SuperSwitchWin::DrawScene() {
> ClearSurface(backsurf, 0);
> BltSurface(backsurf, bmpsurf, x, y);
> x+=xinc; y+=yinc;
> const CRect& displayrect=GetDisplayRect();
> if (x<-160 || x>displayrect.right-160) {
> xinc=-xinc;
> x+=xinc;
> }
> if (y<-100 || y>displayrect.bottom-100) {
> yinc=-yinc;
> y+=yinc;
> }
> backsurf->BltFast(0, 0, modemenusurf, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
> 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()