Графика для Windows средствами DirectDraw | страница 51
> 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, выводит окно сообщения и завершает программу.
Создание поверхностей
Остается лишь создать поверхности, используемые в приложении. После вызова SetDisplayMode() функция ActivateDisplayMode() вызывает еще три функции: CreateFlippingSurfaces(), StorePixelFormatData() и CreateCustomSurfaces(). Функция CreateFlippingSurfaces() создает первичную поверхность с возможностью переключения страниц. Функция StorePixelFormatData() используется для чтения и записи сведений о формате пикселей в данном видеорежиме. Эта информация может пригодиться при работе с видеорежимами High и True Color. Функция CreateCustomSurfaces() отвечает за создание и инициализацию вспомогательных поверхностей, специфических для данного приложения. Начнем с функции CreateFlippingSurfaces():
>BOOL DirectDrawWin::CreateFlippingSurfaces() {
> if (primsurf) primsurf->Release(), primsurf=0;
> DDSURFACEDESC desc;