Private-Bookers
Графика для 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.

Далее 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");

  • Читать дальше
  • 1
  • ...
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • ...

Private-Bookers - русскоязычная библиотека для чтения онлайн. Здесь удобно открывать книги с телефона и ПК, возвращаться к сохраненной странице и держать любимые произведения под рукой. Материалы добавляются пользователями; если считаете, что ваши права нарушены, воспользуйтесь формой обратной связи.

Полезные ссылки

  • Моя полка