DIDATAFORMAT
デバイスのデータ フォーマットを指定します。この構造体は、IDirectInputDevice8::SetDataFormat メソッドで使用されます。
typedef struct DIDATAFORMAT {
DWORD dwSize;
DWORD dwObjSize;
DWORD dwFlags;
DWORD dwDataSize;
DWORD dwNumObjs;
LPDIOBJECTDATAFORMAT rgodf;
} DIDATAFORMAT, *LPDIDATAFORMAT;
メンバ
- dwSize
この構造体のサイズ (バイト)。 - dwObjSize
DIOBJECTDATAFORMAT 構造体のサイズ (バイト単位)。 - dwFlags
データ フォーマットのその他の属性を指定するフラグ。これは次のいずれかの値です。- DIDF_ABSAXIS
軸は絶対モードです。データ フォーマット内でこのフラグを設定することは、IDirectInputDevice8::SetProperty メソッドを使用して軸モード プロパティを手動で設定することと同じです。これを DIDF_RELAXIS フラグと組み合わせて指定することはできません。 - DIDF_RELAXIS
軸は相対モードです。データ フォーマット内でこのフラグを設定することは、IDirectInputDevice8::SetProperty メソッドを使用して軸モード プロパティを手動で設定することと同じです。これを DIDF_ABSAXIS フラグと組み合わせて指定することはできません。
- DIDF_ABSAXIS
- dwDataSize
デバイスから返されるデータ パケットのサイズ (バイト)。この値は 4 の倍数であり、データ パケット内のオブジェクトのデータに対する最大オフセット値を上回っている必要があります。 - dwNumObjs
rgodf 配列内のオブジェクト数。 - rgodf
DIOBJECTDATAFORMAT 構造体の配列のアドレス。それぞれの構造体は、デバイス データ内でオブジェクトのデータを報告する方法を示しています。よくあるエラーとしては、同じ場所に 2 つの情報を配置したり、複数の場所に 1 つの情報を配置したりすることがあります。
解説
アプリケーションは通常、DIDATAFORMAT 構造体を作成する必要はありません。アプリケーションは、定義済みのグローバル データ フォーマット変数 c_dfDIMouse、 c_dfDIMouse2、 c_dfDIKeyboard、 c_dfDIJoystick、または c_dfDIJoystick2 のいずれかを使用できます。
DIDATAFORMAT 構造体を作成する必要があるアプリケーションは、まず IDirectInputDevice8::EnumObjects を呼び出して、現在のデバイスに対して使用可能なオブジェクトを判別する必要があります。これは、オブジェクトが DIDATAFORMAT 構造体には示されていて、現在のデバイスには存在しない場合には、IDirectInputDevice8::SetDataFormat メソッドから DIERR_INVALIDPARAM が返されるからです。
次のコード例では、X 軸と Y 軸があるデバイスのデータ フォーマットを設定します。
// Suppose an application uses the following
// structure to read device data.
typedef struct MYDATA {
LONG lX; // X-axis goes here.
LONG lY; // Y-axis goes here.
BYTE bButtonA; // One button goes here.
BYTE bButtonB; // Another button goes here.
BYTE bPadding[2]; // Must be DWORD multiple in size.
} MYDATA;
// Then, it can use the following data format.
DIOBJECTDATAFORMAT rgodf[ ] = {
{ &GUID_XAxis, FIELD_OFFSET(MYDATA, lX),
DIDFT_AXIS | DIDFT_ANYINSTANCE, 0, },
{ &GUID_YAxis, FIELD_OFFSET(MYDATA, lY),
DIDFT_AXIS | DIDFT_ANYINSTANCE, 0, },
{ &GUID_Button, FIELD_OFFSET(MYDATA, bButtonA),
DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0, },
{ &GUID_Button, FIELD_OFFSET(MYDATA, bButtonB),
DIDFT_BUTTON | DIDFT_ANYINSTANCE, 0, },
};
#define numObjects (sizeof(rgodf) / sizeof(rgodf[0]))
DIDATAFORMAT df = {
sizeof(DIDATAFORMAT), // Size of this structure
sizeof(DIOBJECTDATAFORMAT), // Size of object data format
DIDF_ABSAXIS, // Absolute axis coordinates
sizeof(MYDATA), // Size of device data
numObjects, // Number of objects
rgodf, // And here they are
};