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



: окно полноэкранного приложения DirectDraw должно выводиться поверх остальных окон.

Атрибут верхнего окна, а также занятие им всего экрана необходимы для того, чтобы механизм GDI не смог ничего вывести на экран. GDI ничего не знает о DirectDraw, поэтому наше окно «обманывает» GDI на то время, пока весь экран находится под управлением DirectDraw. Вообще говоря, вывод средствами GDI может происходить и в полноэкранном режиме, но обычно это не рекомендуется, потому что вывод GDI может попасть на невидимую поверхность. Эта тема более подробно рассматривается в главе 5.

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

Фактическое создание окна (вызов функции CreateEx()) заставляет Windows послать нашему приложению сообщение WM_CREATE. Класс DirectDrawWin перехватывает это сообщение в обработчике OnCreate(), созданном ClassWizard (см. листинг 3.1).


Листинг 3.1. Функция DirectDrawWin::OnCreate()

>int DirectDrawWin::OnCreate(LPCREATESTRUCT) {

> DirectDrawEnumerate(DriverAvailable, this);

> if (totaldrivers==0) {

>  AfxMessageBox("No DirectDraw drivers detected");

>  return -1;

> }

> int driverindex=SelectDriver();

> if (driverindex<0) {

>  TRACE("No DirectDraw driver selected\n");

>  return -1;

> } else if (driverindex>totaldrivers-1) {

>  AfxMessageBox("Invalid DirectDraw driver selected\n");

>  return -1;

> }

> LPDIRECTDRAW ddraw1;

> DirectDrawCreate(driver[driverindex].guid, &ddraw1, 0);

> HRESULT r;

> r=ddraw1->QueryInterface(IID_IDirectDraw2, (void**)&ddraw2);

> if (r!=S_OK) {

>  AfxMessageBox("DirectDraw2 interface not supported");

>  return -1;

> }

> ddraw1->Release(), ddraw1=0;

> ddraw2->SetCooperativeLevel(GetSafeHwnd(), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX);

> ddraw2->EnumDisplayModes(0, 0, this, DisplayModeAvailable);

> qsort(displaymode, totaldisplaymodes, sizeof(DisplayModeInfo),   CompareModes);

> int initmode=SelectInitialDisplayMode();

> if (ActivateDisplayMode(initmode)==FALSE) return -1;

> return 0;

>}

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

• Получение списка всех драйверов DirectDraw.

• Выбор драйвера DirectDraw.

• Инициализация DirectDraw с использованием выбранного драйвера.

• Получение списка поддерживаемых видеорежимов.

• Выбор исходного видеорежима.

• Активизация выбранного видеорежима.

• Создание поверхностей приложения.

Все эти этапы рассматриваются в последующих разделах.

Получение списка драйверов DirectDraw