Графика для Windows средствами DirectDraw | страница 82
> 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-файла (палитровую или беспалитровую) следует использовать при восстановлении поверхности. Затем мы проверяем, действительно ли поверхность была потеряна.