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

на главную - закладки

Жанры

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

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

Шрифт:

HRESULT WINAPI SuperSwitchWin::StoreModeInfo(LPDDSURFACEDESC desc, LPVOID p) {

 DWORD w=desc->dwWidth;

 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

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;

Поделиться:
Популярные книги

1941: Время кровавых псов

Золотько Александр Карлович
1. Всеволод Залесский
Приключения:
исторические приключения
6.36
рейтинг книги
1941: Время кровавых псов

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Попаданка 2

Ахминеева Нина
2. Двойная звезда
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка 2

Кротовский, не начинайте

Парсиев Дмитрий
2. РОС: Изнанка Империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, не начинайте

Вечный. Книга VI

Рокотов Алексей
6. Вечный
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Вечный. Книга VI

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

Миф об идеальном мужчине

Устинова Татьяна Витальевна
Детективы:
прочие детективы
9.23
рейтинг книги
Миф об идеальном мужчине

Кровь на эполетах

Дроздов Анатолий Федорович
3. Штуцер и тесак
Фантастика:
альтернативная история
7.60
рейтинг книги
Кровь на эполетах

Темный Лекарь 6

Токсик Саша
6. Темный Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Темный Лекарь 6

Опасная любовь командора

Муратова Ульяна
1. Проклятые луной
Фантастика:
фэнтези
5.00
рейтинг книги
Опасная любовь командора

Как я строил магическую империю 4

Зубов Константин
4. Как я строил магическую империю
Фантастика:
боевая фантастика
постапокалипсис
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 4

Титан империи 8

Артемов Александр Александрович
8. Титан Империи
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Титан империи 8

На прицеле

Кронос Александр
6. Лэрн
Фантастика:
фэнтези
боевая фантастика
стимпанк
5.00
рейтинг книги
На прицеле

Вечный. Книга III

Рокотов Алексей
3. Вечный
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга III