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


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


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

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


int DirectDrawWin::OnCreate(LPCREATESTRUCT) { pDirectDrawEnumerate(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) { pAfxMessageBox("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() (при поддержке нескольких вспомогательных функций). Процесс инициализации состоит из семи этапов:

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

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

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

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

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

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

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

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




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



Книжный магазин