センサーの値をポーリングにより取得するサンプルコード

#include <windows.h>
#include <atlbase.h>


#import "progid:TDxInput.Device" no_namespace


#define WND_CLS_NAME    "SpaceNavigator"
#define TIMER_ELAPSE    100

#define WINDOW_WIDTH    500
#define WINDOW_HEIGHT   100


CComPtr<ISensor> gSensor; // Sensorオブジェクト
UINT_PTR gTimerId = NULL; // Timerオブジェクト

ポーリングを行うためのコールバック関数

// ポーリングを行うためのタイマーのコールバック関数
VOID CALLBACK _3DxTimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime )
{
    if( gSensor )
    {
        // Sensorオブジェクトから Rotationを取得する
        CComPtr<IAngleAxis> pRotation = gSensor->Rotation;

        char rotationText[ 0xFF ];
        sprintf(
            rotationText,
            "Rotation x:%+5.3f y:%+5.3f z:%+5.3f angle:%5.2f  ",
            pRotation->X,       // 軸ベクトル Ax
            pRotation->Y,       // 軸ベクトル Ay
            pRotation->Z,       // 軸ベクトル Az
            pRotation->Angle    // 回転角
            );


        // Sensorオブジェクトから Translationを取得する
        CComPtr<IVector3D> pTranslation = gSensor->Translation;

        char translationText[ 0xFF ];
        sprintf(
            translationText,
            "Translation x:%+5.2f y:%+5.2f z:%+5.2f length:%5.2f  ",
            pTranslation->X,        // 位置ベクトル Px
            pTranslation->Y,        // 位置ベクトル Py
            pTranslation->Z,        // 位置ベクトル Pz
            pTranslation->Length    // 距離
            );


        HDC hdc = ::GetDC( hwnd );

        ::TextOut( hdc, 0, 0, rotationText, ::lstrlen( rotationText ) );
        ::TextOut( hdc, 0, 30, translationText, ::lstrlen( rotationText ) );

        ::ReleaseDC( hwnd, hdc );


        // RotationとTranslationを解放する
        pRotation.Release();
        pTranslation.Release();
    }
}

初期化処理

// 初期化処理
bool _3DxCreate()
{
    HRESULT hResult;

    // COMライブラリを初期化する
    hResult = ::CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
    if( SUCCEEDED( hResult ) )
    {
        CComPtr<IUnknown> _3DxDevice;

        // Deviceオブジェクトを生成する
        hResult = _3DxDevice.CoCreateInstance( __uuidof( Device ) );
        if( SUCCEEDED( hResult ) )
        {
            CComPtr<ISimpleDevice> _3DxSimpleDevice;

            // インターフェイスへのポインタを取得する
            hResult = _3DxDevice.QueryInterface( &_3DxSimpleDevice );
            if( SUCCEEDED( hResult ) )
            {
                // Sensorオブジェクトを取得する
                gSensor = _3DxSimpleDevice->Sensor;


                // Deviceにコンフィギュレーションを関連付ける
                _3DxSimpleDevice->LoadPreferences( "Sample" );

                // ドライバへ接続する
                _3DxSimpleDevice->Connect();

                return true;
            }
        }
    }
    return false;
}

終了処理

// 終了処理
bool _3DxDestroy()
{
    CComPtr<ISimpleDevice> _3DxDevice;

    if( gSensor )
    {
        // SensorからDeviceを取得する
        gSensor->get_Device( ( IDispatch** )&_3DxDevice );

        // Sensorを解放する
        gSensor.Release();
    }

    if( _3DxDevice )
    {
        // Deviceをドライバから切り離す
        _3DxDevice->Disconnect();

        // Deviceを解放する
        _3DxDevice.Release();
    }

    return true;
}

ウィンドウ プロシージャ

// ウィンドウ プロシージャ
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch( uMsg )
    {
        case WM_CREATE:
            if( _3DxCreate() )
            {
                // タイマーを設定する
                gTimerId = ::SetTimer( hWnd, 0, TIMER_ELAPSE, _3DxTimerProc );
            }
            break;

        case WM_DESTROY:
            _3DxDestroy();

            if( gTimerId )
            {
                ::KillTimer( hWnd, gTimerId);
                gTimerId = NULL;
            }

            ::PostQuitMessage( 0 );
            break;

        default:
            return ::DefWindowProc( hWnd, uMsg, wParam, lParam );
    }
    return 0;
}

初期エントリポイント

// Win32アプリケーションの初期エントリポイント
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASS wndcls;
    ::ZeroMemory( &wndcls, sizeof( wndcls ) );

    wndcls.lpfnWndProc = WndProc;
    wndcls.hInstance = hInst;
    wndcls.hbrBackground = ( HBRUSH )COLOR_WINDOW;
    wndcls.lpszClassName = WND_CLS_NAME;

    // ウィンドウクラスを登録する
    if( ::RegisterClass( &wndcls ) == 0 )
    {
        return 0;
    }

    // ウィンドウを作成する
    HWND hWnd = ::CreateWindow(
        WND_CLS_NAME,
        "Space Navigator - Polling",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        WINDOW_WIDTH,
        WINDOW_HEIGHT,
        0,
        0,
        hInst,
        NULL
        );

    if( hWnd == NULL )
    {
        return 0;
    }

    // ウィンドウを表示する
    ::ShowWindow( hWnd, nCmdShow );
    ::UpdateWindow( hWnd );


    MSG msg;
    while( ::GetMessage( &msg, NULL, 0, 0 ) )
    {
        ::DispatchMessage( &msg );
    }

    return msg.wParam;
}