Функция ActivateDisplayMode()
Как было сказано в начале главы, смена видеорежима не сводится к вызову функции 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; } |
Функция ActivateDisplayMode() получает один аргумент — индекс в отсортированном списке обнаруженных видеорежимов. Сначала индекс проверяется на правильность. Если он соответствует допустимому элементу массива displaymode, высота, ширина и глубина заданного режима извлекаются из массива и используются для инициализации переменных displayrect и displaydepth. Затем атрибуты видеорежима используются при вызове функции SetDisplayMode(), активизирующей новый видеорежим.
Далее функция CreateFlipingSurfaces() создает первичную поверхность со вторичным буфером, а функция StorePixelFormatData() проверяет, не устарел ли формат пикселей DirectDrawWin (форматы пикселей подробно рассматриваются в главе 5). Наконец, мы вызываем функцию CreateCustomSurfaces(), отвечающую за создание вспомогательных поверхностей приложения.
Итак, функция ActivateDisplayMode() автоматизирует процесс переключения видеорежимов. Сначала она проверяет, будут ли при вызове функции SetDisplayMode() использоваться правильные аргументы, а затем восстанавливает поверхности приложения. Настало время применить ее на практике.