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


Инициализация


В полноэкранном варианте класса DirectDrawWin функция OnCreate() инициализирует DirectDraw за несколько этапов. Оконный вариант выглядит проще, потому что ему не приходится перечислять драйверы DirectDraw или видеорежимы. Оконная версия функции OnCreate() выглядит так:


int DirectDrawWin::OnCreate(LPCREATESTRUCT) { 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.



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