Вход/Регистрация
Графика для Windows средствами DirectDraw
вернуться

Трухильо Стэн

Шрифт:

В оставшейся части класса CursorWin объявляются две группы переменных. Первая группа относится к работе с мышью. Все эти переменные объявлены статическими, чтобы статическая функция MouseThread могла к ним обратиться (а также потому, что доступ к статическим переменным осуществляется чуть быстрее).

Обратите внимание: в число переменных мыши входят объекты классов CCriticalSection, CEvent и CWinThread, предназначенные для синхронизации двух потоков нашей программы.

Мы объявляем два указателя на объекты CEvent — один используется для оповещений DirectInput, а второй сигнализирует о завершении потока.

Вторая группа переменных не относится к работе с мышью. В нее входит массив указателей на интерфейсы DirectDrawSurface, через которые мы обращаемся к отдельным кадрам анимации спирали.

Инициализация приложения 

Наше знакомство с программой Cursor начинается с функции OnCreate, которая отвечает за инициализацию DirectDraw, DirectInput и потока ввода. Функция OnCreate приведена в листинге 7.2.

Листинг 7.2. Функция CursorWin::OnCreate

int CursorWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {

 HRESULT r=DirectInputCreate(AfxGetInstanceHandle, DIRECTINPUT_VERSION, &dinput, 0);

 if (r!=DI_OK) {

AfxMessageBox("DirectInputCreate failed");

return -1;

 }

 if (InitMouse==FALSE) return -1;

 if (InitKeyboard==FALSE) return -1;

 if (DirectDrawWin::OnCreate(lpCreateStruct) == -1) return -1;

 mousethread->ResumeThread;

 return 0;

}

Сначала OnCreate инициализирует DirectInput функцией DirectInputCreate. Затем мышь и клавиатура инициализируются функциями InitMouse и InitKeyboard, после чего вызывается функция DirectDrawWin::OnCreate. Функция InitMouse, которую мы рассмотрим чуть ниже, создает поток ввода, доступ к которому осуществляется через указатель mousepointer. Однако поток ввода создается в приостановленном состоянии, чтобы он не пытался преждевременно обращаться к первичной поверхности. Поток будет запущен лишь после инициализации DirectDraw. Приостановленный поток активизируется функцией CWinThread::ResumeThread.

Давайте рассмотрим функцию InitMouse, чтобы получить общее представление об инициализации мыши и создании потока ввода. Функция InitMouse приведена в листинге 7.3.

Листинг 7.3. Функция InitMouse

BOOL CursorWin::InitMouse {

 HRESULT r;

 r = dinput->CreateDevice(GUID_SysMouse, &mouse, 0);

 if (r!=DI_OK) {

TRACE("CreateDevice(mouse) failed\n");

return FALSE;

 }

 r = mouse->SetDataFormat(&c_dfDIMouse);

 if (r!=DI_OK) {

TRACE("mouse->SetDataFormat failed\n");

return FALSE;

 }

 r = mouse->SetCooperativeLevel(GetSafeHwnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);

 if (r!=DI_OK) {

TRACE("mouse->SetCooperativeLevel failed\n");

return FALSE;

 }

 DIPROPDWORD property;

 property.diph.dwSize=sizeof(DIPROPDWORD);

 property.diph.dwHeaderSize=sizeof(DIPROPHEADER); 

 property.diph.dwObj=0;

 property.diph.dwHow=DIPH_DEVICE;

 property.dwData=64;

 r = mouse->SetProperty(DIPROP_BUFFERSIZE, &property.diph);

 if (r!=DI_OK) {

TRACE("mouse->SetProperty failed (buffersize)\n");

return FALSE;

 }

 mouse_event[mouse_event_index]=new CEvent;

 mouse_event[quit_event_index]=new CEvent;

 r = mouse->SetEventNotification(*mouse_event[mouse_event_index]);

 if (r!=DI_OK) {

TRACE("mouse->SetEventNotification failed\n");

return FALSE;

 }

 mousethread=AfxBeginThread((AFX_THREADPROC)MouseThread, this, THREAD_PRIORITY_TIME_CRITICAL, 0, CREATE_SUSPENDED);

  • Читать дальше
  • 1
  • ...
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: