Как было сказано в начале главы, смена видеорежима не сводится к вызову функции SetDisplayMode(). Функция SetDisplayMode() активизирует нужный режим, но при этом необходимо уничтожить существующие поверхности и создать их заново. Класс DirectDrawWin решает эту задачу за вас. В него входит функция ActivateDisplayMode(), выполняющая все действия, необходимые для активизации видеорежима и восстановления поверхностей приложения. Для удобства давайте снова посмотрим, как выглядит функция ActivateDisplayMode() (см. листинг 4.1).
Листинг 4.1. Функция DirectDrawWin::ActivateDisplayMode()
| BOOL DirectDrawWin::ActivateDisplayMode( int mode ) { if ( mode<0 || mode>=totaldisplaymodes ) return FALSE;
DWORD width = displaymode[mode].width; DWORD height = displaymode[mode].height; DWORD depth = displaymode[mode].depth; displayrect.left=0; displayrect.top=0; displayrect.right=width; displayrect.bottom=height; displaydepth=depth; ddraw2->SetDisplayMode( width, height, depth, rate, 0 ); curdisplaymode = mode; TRACE("------------------- %dx%dx%d (%dhz) ---------------\n", width, height, depth, rate); if (CreateFlippingSurfaces()==FALSE) { FatalError("CreateFlippingSurfaces() failed"); return FALSE; } StorePixelFormatData(); if (CreateCustomSurfaces()==FALSE) { FatalError("CreateCustomSurfaces() failed"); return FALSE; } return TRUE; } |
Далее функция CreateFlipingSurfaces() создает первичную поверхность со вторичным буфером, а функция StorePixelFormatData() проверяет, не устарел ли формат пикселей DirectDrawWin (форматы пикселей подробно рассматриваются в главе 5). Наконец, мы вызываем функцию CreateCustomSurfaces(), отвечающую за создание вспомогательных поверхностей приложения.
Итак, функция ActivateDisplayMode() автоматизирует процесс переключения видеорежимов. Сначала она проверяет, будут ли при вызове функции SetDisplayMode() использоваться правильные аргументы, а затем восстанавливает поверхности приложения. Настало время применить ее на практике.