Графика для Windows средствами DirectDraw

Активизация видеорежима


На предпоследнем этапе происходит активизация выбранного режима. Для этого используется функция ActivateDisplayMode(), которая на самом деле выполняет и задачу последнего этапа (создание поверхностей приложения). Код этой функции приведен в листинге 3.2.

Листинг 3.2. Функция 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; }


Нужный видеорежим определяется параметром mode, который сначала проверяется на правильность. Затем его ширина, высота и глубина извлекаются из массива displaymode и заносятся в переменные displayrect и displaydepth. Доступ к этим переменным в производных классах осуществляется с помощью функций GetDisplayRect() и GetDisplayDepth().

Далее выбранный режим активизируется функцией SetDisplayMode() интерфейса DirectDraw. При вызове этой функции передаются пять аргументов: первые три определяют разрешение экрана (ширину и высоту) и глубину пикселей, а четвертый — частоту смены кадров. Пятый аргумент пока не используется и должен быть равен нулю.

Перед тем как рассматривать оставшуюся часть функции, следует сделать одно важное замечание. До сих пор, если функция заканчивалась неудачей и требовалось вывести сообщение, можно было использовать функцию MFC AfxMessageBox(). Пока видеорежим не изменялся, все было нормально, но после изменения видеорежима для вывода сообщений и завершения программы применяется функция FatalError(). Эта функция класса DirectDrawWin восстанавливает видеорежим Windows, выводит окно сообщения и завершает программу.



Содержание раздела