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