Графика для Windows средствами DirectDraw
Шрифт:
• GUID_SysKeyboard
• GUID_SysMouse
Значения GUID остальных устройств можно получить функцией EnumDevices.
Функция EnumDevices обнаруживает устройства ввода, установленные на данном компьютере. Она позволяет составить список устройств по их типу, по факту их текущего подключения к компьютеру и по тому, являются ли они устройствами с обратной связью. Для каждого устройства, обнаруженного функцией EnumDevices, предоставляются два значения GUID: GUID экземпляра и GUID продукта. GUID экземпляра идентифицирует конкретное
С помощью функции GetDeviceStatus можно определить, доступно ли устройство для DirectInput в данный момент. Код возврата DI_OK означает, что устройство подключено и доступно. Функция RunControlPanel вызывает приложение DirectInput Control Panel. Точнее, она вызывает приложение DirectX Control Panel и активизирует вкладку DirectInput.
Доступ ко всем устройствам ввода, представленным в DirectInput, осуществляется через интерфейс DirectInputDevice. Интерфейс DirectInputDevice содержит следующие функции:
• Acquire
• Unacquire
• GetCapabilities
• GetDeviceData
• GetDeviceInfo
• GetDeviceState
• SetDataFormat
• SetEventNotification
• EnumObjects
• GetObjectInfo
• GetProperty
• SetProperty
• SetCooperativeLevel
• RunControlPanel
Не стоит полагать, что для работы с устройствами понадобятся все эти функции. Тем не менее мы кратко рассмотрим каждую из них.
Функции Acquire и Unacquire устанавливают и разрывают связь между устройством ввода и DirectInput. Перед тем как получать от устройства данные, необходимо захватить его.
Функция Acquire используется для начального захвата устройства и для восстановления нарушенной связи с устройством. Обычно связь между устройством ввода и DirectInput разрывается из-за того, что приложение теряет фокус ввода. Функция Unacquire используется, как правило, для того, чтобы вернуть Windows право доступа к устройству. Например, при работе с меню необходимо уступить объекты DirectInputDevice, представляющие мышь и клавиатуру, чтобы Windows могли нормально обработать выбор команды меню.
Функция GetCapabilities с помощью структуры DIDEVCAPS описывает возможности устройства, в том числе количество кнопок, количество осей и поддержку обратной связи. Кроме того, в структуру включаются описания конкретных особенностей (или ограничений) устройства, влияющих на его использование. Например, установка флага DIDC_POLLEDDEVICE означает, что от устройства можно получать лишь непосредственные данные.
Функция GetDeviceData получает от устройства буферизованные данные. Она позволяет извлечь из буфера один или несколько элементов, а также просмотреть его содержимое (то есть прочитать элементы буфера без их удаления).
Функция GetDeviceInfo
Функция GetDeviceState предназначена для получения непосредственных данных от устройства. Она определяет состояние устройства на момент вызова функции. Например, с ее помощью можно узнать об одновременном нажатии двух клавиш.
Функция SetDataFormat описывает формат, в котором вводимые данные возвращаются устройством. Приложение может определить собственный формат, а в DirectInput предусмотрены три стандартных формата для стандартных устройств:
• c_dfDIKeyboard
• c_dfDIMouse
• c_dfDIJoystick
Перед захватом устройства необходимо вызвать для него функцию SetDataFormat.
Функция SetEventNotification, особенно часто используемая в многопоточных приложениях, предназначена для обработки оповещений. При изменении состояния данного устройства DirectInput сигнализирует о наступлении события. Таким образом, поток может перейти в режим блокировки (например, с помощью функции WaitForSingleObject) и ожидать изменений в устройстве ввода. При наступлении события поток автоматически отреагирует на него.
Каждое устройство ввода содержит один или несколько объектов. Для клавиатуры объект представляет отдельную клавишу. Для мыши объекты представляют каждую кнопку и каждую ось. Функция EnumObjects составляет список объектов заданного устройства и возвращает для каждого объекта GUID и строку. Строка содержит неформальное описание объекта (например, «ось X» или «Right Shift»). GUID описывает тип объекта и может принимать одно из следующих значений:
• GUID_XAxis
• GUID_YAxis
• GUID_ZAxis
• GUID_RAxis
• GUID_UAxis
• GUID_VAxis
• GUID_Button
• GUID_Key
• GUID_POV
Чтобы успокоить вас, скажу, что функция EnumObjects обычно не нужна, особенно для стандартных устройств. Например, для работы с клавиатурой вам не придется составлять список всех клавиш.
Функция GetObjectInfo позволяет получить ту же информацию, что и EnumObjects, но без предварительного составления списка объектов. Интересующий вас объект задается значением его смещения или идентификатора.
Функции GetProperty и SetProperty применяются для просмотра и установки параметров устройств (свойств), отсутствующих в DirectInput API. В DirectInput предусмотрен ряд стандартных свойств (например, свойства autocenter и deadzone для джойстиков), однако эти функции могут применяться и для других, нестандартных свойств.