Графика для Windows средствами DirectDraw
Шрифт:
Затем переменная m_pMainWnd инициализируется указателем на созданный объект окна. Эта переменная принадлежит классу CWinApp; инициализируя ее, вы сообщаете классу CWinApp о том, каким объектом окна он будет управлять. Если m_pMainWnd не будет присвоен указатель на окно, MFC завершает приложение с ошибкой.
Наконец, мы вызываем функцию DirectDrawApp:InitInstance и используем полученное от нее значение в качестве результата функции BounceApp::InitInstance. Функция InitInstance класса DirectDrawApp выглядит так:
Я
Создание и отображение окна завершает процесс инициализации классов DirectDrawApp и BounceApp. Теперь давайте посмотрим, как этот процесс отражается на классах DirectDrawWin и BounceWin.
Как мы уже знаем, функция Create вызывается из функции BounceApp:: InitInstance. Она не реализуется классом BounceWin, а наследуется от DirectDrawWin. Функция Create выглядит так:
Сначала функция Create регистрирует класс окна с помощью функции AfxRegisterWndClass. Затем она вызывает функцию CreateEx, в которой и происходит фактическое создание окна.
Обратите внимание на то, что создаваемое окно имеет размеры 100x100 (седьмой и восьмой аргументы CreateEx). Такой размер выбран произвольно. DirectDraw при подключении окна автоматически изменяет его размер так, чтобы оно занимало весь экран. Также обратите внимание на флаг WS_EX_TOPMOST: окно полноэкранного приложения DirectDraw должно выводиться поверх остальных окон.
Атрибут верхнего окна, а также занятие им всего экрана необходимы для того, чтобы механизм GDI не смог ничего вывести на экран. GDI ничего не знает о DirectDraw, поэтому наше окно «обманывает» GDI на то время, пока весь экран находится под управлением DirectDraw. Вообще говоря, вывод средствами GDI может происходить и в полноэкранном режиме, но обычно это не рекомендуется, потому что вывод GDI может попасть на невидимую поверхность. Эта тема более подробно рассматривается в главе 5.
Инициализация DirectDraw
Фактическое
Листинг 3.1. Функция DirectDrawWin::OnCreate
Вся инициализация DirectDraw выполняется в функции OnCreate (при поддержке нескольких вспомогательных функций). Процесс инициализации состоит из семи этапов:
• Получение списка всех драйверов DirectDraw.
• Выбор драйвера DirectDraw.
• Инициализация DirectDraw с использованием выбранного драйвера.
• Получение списка поддерживаемых видеорежимов.
• Выбор исходного видеорежима.
• Активизация выбранного видеорежима.
• Создание поверхностей приложения.
Все эти этапы рассматриваются в последующих разделах.
Функция DirectDrawEnumerate предназначена для составления списка доступных драйверов DirectDraw. Чаще всего обнаруживается всего один драйвер DirectDraw — тот, который управляет установленной видеокартой. Тем не менее в некоторых конфигурациях может присутствовать несколько видеоустройств. В таких случаях DirectDrawEnumerate покажет отдельный драйвер для каждого видеоустройства, поддерживаемого DirectDraw.