Инициализация 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() (при поддержке нескольких вспомогательных функций). Процесс инициализации состоит из семи этапов:
- Получение списка всех драйверов DirectDraw.
- Выбор драйвера DirectDraw.
- Инициализация DirectDraw с использованием выбранного драйвера.
- Получение списка поддерживаемых видеорежимов.
- Выбор исходного видеорежима.
- Активизация выбранного видеорежима.
- Создание поверхностей приложения.
Все эти этапы рассматриваются в последующих разделах.
Содержание Назад Вперед