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

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

Жанры

Графика для 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;

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

Семья. Измена. Развод

Высоцкая Мария Николаевна
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Семья. Измена. Развод

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Искушение генерала драконов

Лунёва Мария
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Искушение генерала драконов

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Камень Книга одиннадцатая

Минин Станислав
11. Камень
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Камень Книга одиннадцатая

Никто и звать никак

Ром Полина
Фантастика:
фэнтези
7.18
рейтинг книги
Никто и звать никак

Возвышение Меркурия. Книга 14

Кронос Александр
14. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 14

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Пограничная река. (Тетралогия)

Каменистый Артем
Пограничная река
Фантастика:
фэнтези
боевая фантастика
9.13
рейтинг книги
Пограничная река. (Тетралогия)

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Сумеречный Стрелок 10

Карелин Сергей Витальевич
10. Сумеречный стрелок
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Сумеречный Стрелок 10