Трухильо Стэн
Шрифт:
Рис. 6.1. Программа Qwerty
На экране изображены буквы Qwerty и названия еще нескольких клавиш. Программа с помощью DirectInput обнаруживает нажатые клавиши и рисует их в наклонном начертании. Все остальные клавиши рисуются прямо.
В программе Qwerty, как и во всех остальных программах этой книги, специализированный класс окна порождается от базового класса DirectDrawWin. В данном случае производный класс называется QwertyWin (см. листинг 6.1).
Листинг 6.1. Класс QwertyWin
Прежде чем двигаться дальше, обратите внимание на отсутствие обработчика OnKeyDown. Во всех программах, рассмотренных нами ранее, функция OnKeyDown обрабатывала сообщения от клавиатуры. В программе Qwerty мы пользуемся услугами DirectInput и потому не нуждаемся в OnKeyDown.
В самом начале объявляются три обработчика сообщений:
• OnCreate
• OnDestroy
• OnActivate
Функция OnCreate инициализирует и настраивает DirectInput, а функция OnDestroy освобождает объекты DirectInput. Функция OnActivate, вызываемая MFC при получении или потере фокуса, будет использована для повторного захвата клавиатуры.
Две следующие функции, 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.