Графика для Windows средствами DirectDraw
Шрифт:
Прежде чем двигаться дальше, обратите внимание на отсутствие обработчика OnKeyDown. Во всех программах, рассмотренных нами ранее, функция OnKeyDown обрабатывала сообщения от клавиатуры. В программе Qwerty мы пользуемся услугами DirectInput и потому не нуждаемся в OnKeyDown.
В самом начале объявляются три обработчика сообщений:
• OnCreate
• OnDestroy
• OnActivate
Функция OnCreate
Две следующие функции, SelectDriver и SelectInitialDisplayMode, присутствуют почти во всех наших программах. Они остались в том виде, в котором их создал AppWizard, и потому не требуют обсуждения.
Функции CreateCustomSurfaces и RestoreSurfaces делают то же, что и раньше, так что они тоже не рассматриваются. Достаточно сказать, что эти функции инициализируют и восстанавливают поверхности, указатели на которые объявляются в нижней части листинга 6.1.
Функция DrawScene с помощью DirectInput определяет, какие клавиши были нажаты, и обеспечивает соответствующий вывод. Вскоре мы рассмотрим эту функцию.
После функций следуют переменные класса. Сначала объявляется указатель на интерфейс DirectInput(dinput), через него выполняется инициализация и осуществляются обращения к DirectInput. Переменная key — указатель на интерфейс DirectInputDevice, используемый для обращений к клавиатуре. Логическая переменная esc_pressed сигнализирует о завершении приложения.
Оставшаяся часть определения класса состоит из указателей на интерфейсы DirectDrawSurface. Для каждой клавиши, поддерживаемой приложением, создаются две поверхности (для нажатого и отпущенного состояния).
Инициализация DirectInput
Инициализация DirectInput и DirectDraw выполняется в функции OnCreate. DirectInput инициализируется версией OnCreate класса QwertyWin, а DirectDraw — версией из DirectDrawWin. Функция QwertyWin::OnCreate приведена в листинге 6.2.
Листинг 6.2. Функция QwertyWin::OnCreate
Прежде
Сначала функция OnCreate инициализирует указатель dinput с помощью функции DirectInputCreate, которой необходимо передать четыре аргумента. Вызов этой функции выглядит так:
Первый аргумент - логический номер экземпляра приложения, получаемый функцией AfxGetInstanceHandle. Второй аргумент — номер версии DirectInput. В нашем случае используется константа DIRECTINPUT_VERSION, она определяется DirectInput в зависимости от версии SDK, использованной для компиляции приложения. Различные версии DirectInput более подробно рассматриваются в этой главе ниже. Третий аргумент DirectInputCreate — адрес инициализируемого указателя, а четвертый — показатель агрегирования COM, который обычно равен нулю (агрегированием называется разновидность наследования, используемая в COM). Если инициализация DirectInput проходит успешно (то есть если DirectInputCreate возвращает DI_OK), указатель dinput может использоваться для работы с DirectInput.
Затем мы создаем экземпляр интерфейса DirectInputDevice, который представляет клавиатуру. Я снова приведу соответствующую строку листинга 6.2:
Функция CreateDevice интерфейса DirectInput применяется для инициализации устройств DirectInput. В нашем случае первым аргументом является стандартная константа GUID_SysKeyboard, показывающая, что мы собираемся работать с системной клавиатурой. Второй аргумент — адрес указателя keyboard, через который мы впоследствии будем обращаться к клавиатуре. Третий аргумент — показатель агрегирования COM, в нашем случае он должен быть равен нулю.
Следующий шаг — выбор формата данных устройства. Для клавиатуры он выполняется просто:
Функции SetDataFormat интерфейса DirectInputDevice передается единственный аргумент — константа стандартного формата c_dfDIKeyboard. Программа Qwerty работает лишь с одним устройством (клавиатурой), но, как мы убедимся в программе Smear, формат данных должен задаваться отдельно для каждого устройства, используемого программой.