netlib.narod.ru | < Назад | Оглавление | Далее > |
Следующая в очереди — мышь. Инициализация мыши практически полностью идентична инициализации клавиатуры, за исключением указания специфичных для мыши идентификатора и формата данных:
IDirecInputDevice8* InitMouse(HWND hWnd, IDirectInput8* pDI) { IDirectInputDevice8 *pDIDevice; // Создаем объект устройства if(FAILED(pDI->CreateDevice(GUID_SysMouse, &pDIDevice, NULL))) return NULL; // Устанавливаем формат данных if(FAILED(pDIDevice->SetDataFormat(&c_dfDIMouse))) { pDIDevice->Release(); return NULL; } // Задаем режим кооперации if(FAILED(pDIDevice->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))) { pDIDevice->Release(); return NULL; } // Захватываем устройство для использования if(FAILED(lpDIDevice->Acquire())) { pDIDevice->Release(); return NULL; } // Если все успешно, возвращаем указатель return lpDIDevice; }
Вызов IDirectInputDevice8::GetDeviceState заполняет структуру данными о мыши, такими как относительное перемещение и состояние кнопок. Определение структуры DIMOUSESTATE выглядит так:
typedef struct { LONG lX; // Относительное изменение координаты X LONG lY; // Относительное изменение координаты Y LONG lZ; // Относительное изменение координаты Z BYTE rgbButtons[4]; // Флаги нажатых клавиш } DIMOUSESTATE, *LPDIMOUSESTATE;
Поскольку значения координат, сообщаемые в структуре DIMOUSESTATE, являются относительными, вам необходимо отслеживать абсолютные значения. Для этого вы создаете пару представляющих абсолютные координаты мыши глобальных переменных с именами g_MouseXPos и g_MouseYPos.
Взгляните на создание объекта и последующее чтение и обработку информации мыши:
// Убедитесь, что ранее инициализированы // глобальный объект DirectInput g_pDI // и дескриптор родительского окна g_hWnd IDirectInputDevice8 *pDIDMouse; // Координаты мыши long g_MouseXPos = 0, g_MouseYPos = 0; // Буфер данных для хранения состояния мыши DIMOUSESTATE MouseState; if((pDIDMouse = InitMouse(g_hWnd, g_pDI)) != NULL) { // Чтение данных ReadData(pDIDMouse, (void*)MouseState, sizeof(DIMOUSESTATE)); // Обновление абсолютных координат g_MouseXPos += MouseState.lX; g_MouseYPos += MouseState.lY; }
Для проверки состояния кнопок мыши можно использовать макрос, аналогичнй тому, который применялся для проверки состояния клавиш клавиатуры:
#define MouseButtonState(x) ((MouseState.rgbButtons[x] & 0x80) ? TRUE : FALSE)
Вот пример его использования:
if(MouseButtonState(0) == TRUE) { // нажата кнопка 0 }
netlib.narod.ru | < Назад | Оглавление | Далее > |