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


Инициализация - часть 2


Далее OnCreate() вызывает функцию CreateFlippingSurfaces(). Хотя оконное приложение не может выполнять настоящего переключения страниц (как можно было бы решить, исходя из имени функции), имя было сохранено, потому что создаваемые в ней поверхности эмулируют переключение страниц. Код функции приведен в листинге 3.4.

Листинг 3.4. Функция CreateFlippingSurfaces() в оконном приложении


BOOL DirectDrawWin::CreateFlippingSurfaces() { HRESULT r;

DDSURFACEDESC desc; desc.dwSize = sizeof( desc ); desc.dwFlags = DDSD_CAPS; desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; r=ddraw2->CreateSurface( &desc, &primsurf, 0 ); if (r!=DD_OK) { TRACE("FAILED to create 'primsurf'\n"); return FALSE; }

r=ddraw2->CreateClipper( 0, &clipper, 0 ); if (r!=DD_OK) { TRACE("CreateClipper() failed\n"); return FALSE; }

r=clipper->SetHWnd( 0, GetSafeHwnd() ); if (r!=DD_OK) { TRACE("SetHWnd() failed\n"); return FALSE; }

r=primsurf->SetClipper( clipper ); if (r!=DD_OK) { TRACE("SetClipper() failed\n"); return FALSE; }

ZeroMemory( &desc, sizeof(desc) ); desc.dwSize = sizeof(desc); desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; desc.dwWidth = displayrect.Width(); desc.dwHeight = displayrect.Height(); desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;

r=ddraw2->CreateSurface( &desc, &backsurf, 0 ); if (r!=DD_OK) { TRACE("failed to create 'backsurf' in video\n"); videobacksurf=FALSE; } else { TRACE("Created backsurf in video\n"); videobacksurf=TRUE; }

return TRUE; }


Сначала мы создаем первичную поверхность. В полноэкранном варианте код выглядит по-другому, потому что здесь создается обычная, несоставная первичная поверхность. В структуре DDSURFACEDESC мы описываем первичную поверхность, используя только флаг DDSCAPS_PRIMARYSURFACE. Затем описанная поверхность создается функцией CreateSurface() интерфейса DirectDraw.

Далее функция CreateClipper() интерфейса DirectDraw создает объект отсечения. CreateClipper() получает три аргумента, однако первый и последний из них чаще всего равны нулю.


Начало  Назад  Вперед