MouseMove

MouseMove

Windows10 Direct3D で Mouse の座標を検出します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. Windows10 ではマウスのクリック(移動)を PointerEvent で検出します。
    Mouse(PointerEvent) の基礎は C++ のページから Win10 Mouse を参照して下さい。
    Direct2D の Mouse(PointerEvent) は Mouse Image を参照して下さい。
    3Dモデルの回転は Win10 MouseRot を参照して下さい。
    リンク出来ない時は私のトップページからたどって下さい。
    PointerEvent 関係の API は仕様が固まっておらず、バージョンが変わると動かなくなるかも知れません。
    このプロジェクトは 2016/03/02 Windows10 & Visual Studio Community 2015 の環境で開発しました。
  2. Windows10 Direct3D で Mouse を検出するときは DirectX 11 および XAML アプリ(ユニバーサル Windows)を選びます。
    Visual Studio 2015 を起動して Win10 Template を参照して構築して下さい。
    メニューから[ビルド][ソリューションのビルド]を実行します。
    緑色の右三角アイコン(ローカル コンピュータ)のクリックで実行します。
    カラーキューブが回転し、FPS と TextBox に XAML! が表示されます。
  3. DirectX 11 および XAML アプリ(ユニバーサル Windows)には、最初から PointerEvent のハンドラが組み込まれています。
    DirectXPage.xaml.h には Pointer 関係の EventHandler が定義されています。
        // 独立入力の処理関数。
        void OnPointerPressed(Platform::Object^ sender, Windows::UI::Core::PointerEventArgs^ e);
        void OnPointerMoved(Platform::Object^ sender, Windows::UI::Core::PointerEventArgs^ e);
        void OnPointerReleased(Platform::Object^ sender, Windows::UI::Core::PointerEventArgs^ e);
    
  4. DirectXPage.xaml.cpp には EventHandler の設定と関数本体が定義されています。
        // バックグラウンド スレッドでポインター イベントが発生したときに、そのイベントを登録します。
        m_coreInput->PointerPressed += ref new TypedEventHandler<Object^, PointerEventArgs^>
            (this, &DirectXPage::OnPointerPressed);
        m_coreInput->PointerMoved += ref new TypedEventHandler<Object^, PointerEventArgs^>
            (this, &DirectXPage::OnPointerMoved);
        m_coreInput->PointerReleased += ref new TypedEventHandler<Object^, PointerEventArgs^>
            (this, &DirectXPage::OnPointerReleased);
    
    void DirectXPage::OnPointerPressed(Object^ sender, PointerEventArgs^ e)
    {
        // ポインターがクリックされた時点で、ポインターの移動の追跡を開始します。
        m_main->StartTracking();
    }
    
    void DirectXPage::OnPointerMoved(Object^ sender, PointerEventArgs^ e)
    {
        // ポインター追跡コードを更新します。
        if (m_main->IsTracking())
        {
            m_main->TrackingUpdate(e->CurrentPoint->Position.X);
        }
    }
    
    void DirectXPage::OnPointerReleased(Object^ sender, PointerEventArgs^ e)
    {
        // ポインターが解放された時点で、ポインターの移動の追跡を停止します。
        m_main->StopTracking();
    }
    
  5. OnPointerMoved() で Tracking された時のマウス座標を取得して印字してみましょう。
    関数を宣言しなくても使えるように using の直後にでも置いて下さい。
    void Debug(float x, float y)
    {   wchar_t str[120];
        swprintf(str, 120, L"X:%f Y:%f\n\n", x, y);
        OutputDebugString(str);
    }
    
  6. マウスのX座標とY座標を印字します。
    void DirectXPage::OnPointerMoved(Object^ sender, PointerEventArgs^ e)
    {
        // ポインター追跡コードを更新します。
        if (m_main->IsTracking())
        {
            m_main->TrackingUpdate(e->CurrentPoint->Position.X);
            Debug(e->CurrentPoint->Position.X, e->CurrentPoint->Position.Y);
        }
    }
    
  7. m_main は Class App1Main でバックグラウンドスレッドで実行されます。
        m_main = std::unique_ptr<App1Main>(new App1Main(m_deviceResources));
    
    Class App1Main の詳細は App1Main.cpp(.h) を参照して下さい。

超初心者のプログラム入門(DirectX Store)