Трухильо Стэн
Шрифт:
В оставшейся части класса CursorWin объявляются две группы переменных. Первая группа относится к работе с мышью. Все эти переменные объявлены статическими, чтобы статическая функция MouseThread могла к ним обратиться (а также потому, что доступ к статическим переменным осуществляется чуть быстрее).
Обратите внимание: в число переменных мыши входят объекты классов CCriticalSection, CEvent и CWinThread, предназначенные для синхронизации двух потоков нашей программы.
Мы объявляем два указателя на объекты CEvent — один используется для оповещений DirectInput, а второй сигнализирует о завершении потока.
Вторая группа переменных не относится к работе с мышью. В нее входит массив указателей на интерфейсы DirectDrawSurface, через которые мы обращаемся к отдельным кадрам анимации спирали.
Наше знакомство с программой Cursor начинается с функции OnCreate, которая отвечает за инициализацию DirectDraw, DirectInput и потока ввода. Функция OnCreate приведена в листинге 7.2.
Листинг 7.2. Функция CursorWin::OnCreate
Сначала OnCreate инициализирует DirectInput функцией DirectInputCreate. Затем мышь и клавиатура инициализируются функциями InitMouse и InitKeyboard, после чего вызывается функция DirectDrawWin::OnCreate. Функция InitMouse, которую мы рассмотрим чуть ниже, создает поток ввода, доступ к которому осуществляется через указатель mousepointer. Однако поток ввода создается в приостановленном состоянии, чтобы он не пытался преждевременно обращаться к первичной поверхности. Поток будет запущен лишь после инициализации DirectDraw. Приостановленный поток активизируется функцией CWinThread::ResumeThread.
Давайте рассмотрим функцию InitMouse, чтобы получить общее представление об инициализации мыши и создании потока ввода. Функция InitMouse приведена в листинге 7.3.
Листинг 7.3. Функция InitMouse