Графика для Windows средствами DirectDraw
Шрифт:
Листинг 7.1. Класс CursorWin
Класс CursorWin объявляет три обработчика сообщений: OnCreate, OnDestroy и OnActivate. Функция OnCreate инициализирует DirectDraw, DirectInput и поток ввода. Функция OnDestroy освобождает интерфейсы DirectX и завершает поток ввода. Функция OnActivate
Следующие пять функций наследуются от класса DirectDrawWin:
• SelectDriver
• SelectInitialDisplayMode
• CreateCustomSurfaces
• DrawScene
• RestoreSurfaces
Мы достаточно часто видели эти функции в других приложениях и знаем, что они делают, поэтому не будем рассматривать их. Исключением является функция DrawScene, которая представляет некоторый интерес, потому что помимо создания нового кадра занимается синхронизацией основного потока с потоком ввода.
Затем объявляются функции InitMouse и InitKeyboard. Эти функции используются функцией OnCreate и отвечают за инициализацию объектов DirectInput, предназначенных для работы с мышью и клавиатурой. Функция InitKeyboard совпадает с одноименными функциями программ Qwerty и Smear из главы 6, поэтому она также не рассматривается. Однако функция InitMouse помимо инициализации мыши запускает поток ввода. Вскоре мы рассмотрим эту функцию.
Функция UpdateDelaySurface готовит к выводу поверхность меню задержки. Она выводит текст меню и выделяет текущую задержку.
Далее в классе CursorWin объявляются три функции потока мыши:
• MouseThread
• UpdateCursorSimpleCase
• UpdateCursorComplexCase
Функция MouseThread реализует поток ввода. Когда основной поток создает поток ввода, он передает указатель на статическую функцию MouseThread. Созданный поток использует эту функцию в качестве точки входа и продолжает выполнять ее до возврата из функции или вызова функции AfxEndThread. Функция MouseThread обновляет изображение курсора с помощью функций UpdateCursorSimpleCase и UpdateCursorComplexCase.
В оставшейся части класса CursorWin объявляются две группы переменных. Первая группа относится к работе с мышью. Все эти переменные объявлены статическими, чтобы статическая функция MouseThread могла к ним обратиться (а также потому, что доступ к статическим переменным осуществляется чуть быстрее).
Обратите внимание: в число переменных мыши входят объекты классов CCriticalSection, CEvent и CWinThread, предназначенные для синхронизации двух потоков нашей программы.
Мы объявляем два указателя на объекты CEvent — один используется для оповещений DirectInput, а второй сигнализирует о завершении потока.
Вторая группа переменных не относится к работе с мышью. В нее входит массив указателей на интерфейсы DirectDrawSurface, через которые мы обращаемся к отдельным кадрам анимации спирали.
Наше знакомство с программой Cursor начинается с функции OnCreate, которая отвечает за инициализацию DirectDraw, DirectInput и потока ввода. Функция OnCreate приведена в листинге 7.2.