c_dfDIKeyboard c_dfDIMouse の中身を調べる話
久しぶりの普通の更新ですヽ(・ω・*)ノ
この話のきっかけは、GDKライブラリをVC++2008用にインポートした時でした。
DirectX9SDKに dinput.lib が存在せず、ビルドができなかったのです。
DirectXはCOMで実装されているので、本来はlibファイルをリンクする必要はありません。
が、困ったことにDirectInputだけ「c_dfDIKeyboard」「c_dfDIMouse」というlibに実体がある定数が定義されているのです。
定数の中身をgoogle先生に聞いたのですが、お茶を濁された感じに。
仕方がないので、自分で解析してみました。
// キーボードフォーマットの準備(c_dfDIKeyboardの中身はコレだ!)
DIOBJECTDATAFORMAT obj[256];
DIDATAFORMAT format;
format.dwSize = sizeof(DIDATAFORMAT);
format.dwObjSize = sizeof(DIOBJECTDATAFORMAT);
format.dwFlags = DIDF_RELAXIS;
format.dwDataSize = 256;
format.dwNumObjs = 256;
format.rgodf = obj;for(int i=0; i<256; ++i) {
obj[i].dwOfs = i;
obj[i].dwType = DIDFT_OPTIONAL | DIDFT_BUTTON | (i << 8);
obj[i].dwFlags = 0;
obj[i].pguid = &GUID_Key;
}
// マウスフォーマットの準備(c_dfDIMouseの中身はコレだ!)
DIOBJECTDATAFORMAT obj[7];
DIDATAFORMAT format;
format.dwSize = sizeof(DIDATAFORMAT);
format.dwObjSize = sizeof(DIOBJECTDATAFORMAT);
format.dwFlags = DIDF_RELAXIS;
format.dwDataSize = 16;
format.dwNumObjs = 7;
format.rgodf = obj;obj[0].dwOfs = 0;
obj[0].pguid = &GUID_XAxis;
obj[0].dwType = DIDFT_ANYINSTANCE | DIDFT_AXIS;
obj[0].dwFlags = 0;
obj[1].dwOfs = 4;
obj[1].pguid = &GUID_YAxis;
obj[1].dwType = DIDFT_ANYINSTANCE | DIDFT_AXIS;
obj[1].dwFlags = 0;
obj[2].dwOfs = 8;
obj[2].pguid = &GUID_ZAxis;
obj[2].dwType = DIDFT_ANYINSTANCE | DIDFT_OPTIONAL | DIDFT_AXIS;
obj[2].dwFlags = 0;
obj[3].dwOfs = 12;
obj[3].pguid = NULL;
obj[3].dwType = DIDFT_ANYINSTANCE | DIDFT_BUTTON;
obj[3].dwFlags = 0;
obj[4].dwOfs = 13;
obj[4].pguid = NULL;
obj[4].dwType = DIDFT_ANYINSTANCE | DIDFT_BUTTON;
obj[4].dwFlags = 0;
obj[5].dwOfs = 14;
obj[5].pguid = NULL;
obj[5].dwType = DIDFT_ANYINSTANCE | DIDFT_OPTIONAL | DIDFT_BUTTON;
obj[5].dwFlags = 0;
obj[6].dwOfs = 15;
obj[6].pguid = NULL;
obj[6].dwType = DIDFT_ANYINSTANCE | DIDFT_OPTIONAL | DIDFT_BUTTON;
obj[6].dwFlags = 0;
「c_dfDIKeyboard」「c_dfDIMouse」の代わりに上で定義したformatをDirectInputDevice::SetDataFormatに渡します。
古いSDKの場合 DIDFT_OPTIONAL が定義されていない場合があるので、0x80000000で#defineしてくださいo(`ω´*)o