Стэн Трухильо - Графика для Windows средствами DirectDraw
- Название:Графика для Windows средствами DirectDraw
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стэн Трухильо - Графика для Windows средствами DirectDraw краткое содержание
Графика для Windows средствами DirectDraw - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Обработка пользовательского ввода
При запуске программы Switch текст в нижней части меню подсказывает, какие клавиши управляют работой приложения. Клавиши со стрелками изменяют текущий выделенный видеорежим, клавиша Enterактивизирует его (если он не является текущим), а клавиша Escapeзавершает работу программы. Все эти клавиши обрабатываются функцией OnKeyDown(), создаваемой ClassWizard. Ее код приведен в листинге 4.5.
Листинг 4.5. Функция SwitchWin::OnKeyDown()
void SwitchWin::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:
PostMessage(WM_CLOSE);
break;
case VK_UP:
newindex=selectmode-1;
if (newindex>=0) {
selectmode=newindex;
UpdateMenuSurface();
}
break;
case VK_DOWN:
newindex=selectmode+1;
if (newindex
selectmode=newindex;
UpdateMenuSurface();
}
break;
case VK_LEFT:
newindex=selectmode-rows;
if (newindex>=0) {
selectmode=newindex;
UpdateMenuSurface();
}
break;
case VK_RIGHT:
newindex=selectmode+rows;
if (newindex
selectmode=newindex;
UpdateMenuSurface();
}
break;
case VK_RETURN:
if (selectmode != GetCurDisplayMode()) {
ActivateDisplayMode(selectmode);
x=y=0;
}
break;
case 'S':
SaveSurface(primsurf, "switch.bmp");
break;
case 'M':
SaveSurface(menusurf, "menusurf.bmp");
break;
case 'F':
SaveSurface(fpssurf, "fpssurf.bmp");
break;
case 'T':
SaveSurface(bmpsurf, "trisurf.bmp");
break;
default:
DirectDrawWin::OnKeyDown(nChar, nRepCnt, nFlags);
}
}
Обработка нажатых клавиш происходит в различных секциях оператора switch. Клавиша Escape(код виртуальной клавиши VK_ESCAPE) приводит к посылке сообщения WM_CLOSEи последующему завершению приложения. При нажатии клавиш со стрелками изменяется индекс текущего видеорежима и вызывается функция UpdateMenuSurface(), которая перерисовывает menusurfв соответствии с произведенными изменениями. При нажатии клавиши Enter( VK_RETURN) вызывается функция ActivateDisplayMode(), которой в качестве аргумента передается индекс режима (при условии, что выбран видеорежим, отличный от текущего). Все остальные клавиши, нажатые пользователем, обрабатываются функцией OnKeyDown()базового класса.
Программа Switch почти готова. Она инициализируется, переключает видеорежимы и обрабатывает пользовательский ввод. Но окончательный вид программа примет лишь после того, как мы организуем в ней восстановление потерянных поверхностей. Класс DirectDrawWinобнаруживает потерю поверхностей и автоматически восстанавливает первичную поверхность со вторичным буфером; после этого вызывается функция RestoreSurfaces(), в которой должны восстанавливаться вспомогательные поверхности приложения. В программе Switch функция RestoreSurfaces()реализована так:
void SwitchWin::RestoreSurfaces() {
int displaydepth=GetCurDisplayDepth();
CString filename;
if (displaydepth==8) filename="tri08.bmp";
else filename="tri24.bmp";
if (bmpsurf->IsLost()) {
bmpsurf->Restore();
LoadSurface(bmpsurf, filename);
}
if (menusurf->IsLost()) {
menusurf->Restore();
UpdateMenuSurface();
}
if (fpssurf->IsLost()) {
fpssurf->Restore();
ClearSurface(fpssurf, 0);
}
displayfps=FALSE;
framecount=0;
}
В нашем случае функция RestoreSurfaces()отвечает за восстановление всех трех вспомогательных поверхностей. Ее работа начинается с анимационной поверхности ( bmpsurf). Функция получает текущую глубину пикселей и по ней определяет, какую версию BMP-файла (палитровую или беспалитровую) следует использовать при восстановлении поверхности. Затем мы проверяем, действительно ли поверхность была потеряна.
При этом учитывается, что «потеряться» могут лишь поверхности, находящиеся в видеопамяти. Поверхности в системной памяти никогда не теряются, поэтому предварительная проверка может избавить нас от хлопот с повторной загрузкой содержимого BMP-файла и, следовательно, ускорить процесс восстановления.
Если поверхность потеряна, мы вызываем функцию Restore()интерфейса DirectDrawSurface, чтобы вернуть видеопамять в объеме, достаточном для хранения поверхности. Содержимое поверхности восстанавливается функцией LoadSurface().
Восстановление двух других поверхностей происходит несколько иначе, потому что их содержимое не является BMP-файлом. Поверхность menusurfвосстанавливается функцией Restore()с последующим вызовом функции UpdateMenuSurface(), в которой происходит стирание и перерисовка поверхности меню. При восстановлении fpssurfмы сначала вызываем Restore(), а потом стираем содержимое поверхности, потому что это содержимое после восстановления оказывается непредсказуемым. Не забывайте, поверхности чаще всего теряются из-за того, что занимаемая ими видеопамять понадобилась другому приложению.
Обратите внимание: мы не восстанавливаем значение, отображаемое на поверхности FPS. Потеря первичной поверхности и вторичного буфера означает, что последнее вычисленное значение FPS, по всей видимости, стало неверным. Наша программа было свернута или уступила фокус другому приложению; в любом случае нельзя с уверенностью сказать, насколько быстро обновляется изображение в данный момент. Вместо того чтобы выводить устаревшее значение FPS, мы очищаем поверхность и присваиваем переменной displayfpsзначение FALSE, тем самым запрещая вывод поверхности до получения новой величины FPS. Кроме того, мы обнуляем переменную framecount, чтобы перезапустить механизм вычисления FPS.
Вот и все, что касается программы Switch. Пора заняться частотой смены кадров и перейти к приложению SuperSwitch.
Частота смены кадров
В главе 1 мы узнали, что DirectDraw позволяет приложению задать не только видеорежим, но и частоту смены кадров. Однако перед тем, как писать демонстрационную программу, следует разобраться, что же такое «частота смены кадров».
Частота смены кадров представляет собой скорость обновления экрана. Например, частота в 60 Гц означает, что экран перерисовывается 60 раз в секунду. Данный показатель представляет большой интерес для программистов, работающих с DirectDraw, потому что он управляет скоростью работы приложения. Для полноэкранных приложений DirectDraw с возможностью переключения страниц это происходит автоматически, потому что функция Flip()интерфейса DirectDrawSurfaceсинхронизирует операцию переключения страниц с частотой смены кадров. Такая синхронизация определяет (или, если хотите, ограничивает) скорость, с которой приложение обновляет экран.
Читать дальшеИнтервал:
Закладка: