netlib.narod.ru< Назад | Оглавление | Далее >

DirectInput и мышь

Следующая в очереди — мышь. Инициализация мыши практически полностью идентична инициализации клавиатуры, за исключением указания специфичных для мыши идентификатора и формата данных:

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

Сайт управляется системой uCoz