| 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 | < Назад | Оглавление | Далее > |