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