Microsoft DirectX 8.1 (Visual Basic) |
To retrieve buffered data from the mouse, you must first set the buffer size (see Device Properties). The default size of the buffer is 0, so this step is essential.
You must also declare an array of DIDEVICEOBJECTDATA types. This array can have up to the same number of elements as the buffer size. You do not have to retrieve the entire contents of the buffer with a single call. You can have just one element in the array and retrieve events one at a time until the buffer is empty.
After acquiring the device, you can examine and flush the buffer at any time by using the DirectInputDevice8.GetDeviceData method. (See Buffered and Immediate Data.) On return, each element in the DIDEVICEOBJECTDATA array represents a change in state for a single object on the mouse. For instance, if the user presses button 0 and moves the mouse diagonally, the array passed to GetDeviceData (if it has at least three elements) will have three elements filled in—an element for button 0 being pressed, an element for the change in the x-axis, and an element for the change in the y-axis—and the return value of the method will be 3.
You can determine which object an element in the array refers to by checking the lOfs member of the DIDEVICEOBJECTDATA type against the constants in the CONST_DIMOUSEOFS enumeration. Each of these values is derived from the offset of the data for the object in a DIMOUSESTATE or DIMOUSESTATE2 type. For example, DIMOFS_BUTTON0 is equivalent to the offset of buttons(0) in the DIMOUSESTATE type. DIMOFS_BUTTON4 to DIMOFS_BUTTON7 are supported only for DIMOUSESTATE2.
The data for the change of state of the device object is located in the lData member of the DIDEVICEOBJECTDATA type. For axes, the coordinate value is returned in this member. For button objects, only the low byte of lData is significant. The high bit of this byte is set if the button was pressed, and it is clear if the button was released. In other words, the button was pressed if (lData And &H80) is nonzero.
For more information on the other members of the DIDEVICEOBJECTDATA type, see Time Stamps and Sequence Numbers.
The following code example retrieves the entire contents of the buffer (which contains BufferSize elements) and responds to various events:
' objDIDev is a DirectInputDevice object. Dim diDeviceData(1 To BufferSize) As DIDEVICEOBJECTDATA Dim NumEvents As Integer Dim i As Integer NumEvents = objDIDev.GetDeviceData(diDeviceData, 0) For i = 1 To NumEvents Select Case diDeviceData(i).lOfs Case DIMOFS_X ' Respond to x-axis movement. Case DIMOFS_Y ' Respond to y-axis movement. Case DIMOFS_BUTTON0 If diDeviceData(i).lData And &H80 Then ' Respond to left button pressed. Else ' Respond to left button released. End If End Select Next i