Графика для Windows средствами DirectDraw | страница 64
> LPDIRECTDRAW ddraw1;
> DirectDrawCreate(0, &ddraw1, 0);
> ddraw1->QueryInterface(IID_IDirectDraw2, (void**)&ddraw2); ddraw1->Release(), ddraw1=0; ddraw2->SetCooperativeLevel(GetSafeHwnd(), DDSCL_NORMAL);
> DetectDisplayMode();
> if (CreateFlippingSurfaces()==FALSE) {
> AfxMessageBox("CreateFlippingSurfaces() failed");
> return FALSE;
> }
> if (CreateCustomSurfaces()==FALSE) {
> AfxMessageBox("CreateCustomSurfaces() failed");
> return FALSE;
> }
> return 0;
>}
Сначала указатель на интерфейс DirectDraw(ddraw1) инициализируется функцией DirectDrawCreate(). Указатель ddraw1, как и в полноэкранной версии, используется только для получения указателя на интерфейс DirectDraw2, после чего освобождается.
Затем функция OnCreate() вызывает функцию SetCooperativeLevel(). В полноэкранном приложении уровень кооперации определялся тремя флагами: DDSCL_EXCLUSIVE, DDSCL_FULLSCREEN и DDSCL_ALLOWMODEX. В данном случае используется только флаг DDSCL_NORMAL.
Функция DetectDisplayMode() инициализирует некоторые переменные класса DirectDrawWin. Она выглядит так:
>BOOL DirectDrawWin::DetectDisplayMode() {
> DDSURFACEDESC desc;
> ZeroMemory(&desc, sizeof(desc));
> desc.dwSize=sizeof(desc);
> if (ddraw2->GetDisplayMode(&desc)!=DD_OK) {
> TRACE("GetDisplayMode() failed\n");
> return FALSE;
> }
> displayrect.left=0;
> displayrect.top=0;
> displayrect.right=desc.dwWidth;
> displayrect.bottom=desc.dwHeight;
> displaydepth=desc.ddpfPixelFormat.dwRGBBitCount;
> return TRUE;
>}
Функция DetectDisplayMode() с помощью функции GetDisplayMode() интерфейса DirectDraw получает информацию о текущем видеорежиме Windows. Говоря точнее, разрешение экрана и глубина пикселей текущего видеорежима сохраняются в переменных displayrect и displaydepth.
Далее 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);