2016-04-21 15 views
2

私はDX11を使用してC++で自分のカメラクラスを書きました。 現時点では、シーン内を見回すためにWM_MOUSEMOVEイベントを使用します。 Cursurがウィンドウから抜けるのを防ぐために、WM_MOUSEMOVEイベントが発生するたびにSetCursorPos関数をコールしてマウスを中央に配置します。 しかし、マウスを非常に速く動かすと、カーソルがウィンドウから外れます。 これに対する解決策は、関数ClipCursorを使用していましたが、カーソルがrectの境界線に当たったときにカメラの回転が鈍ってしまいます。そこで、ClipCursorは元の問題を解決しましたが、別の問題で終了しました。ウィンドウ内のトラップカーソル

皆さんはそれに対処していますか?

+0

'SetCapture'は助けますか? –

答えて

2

通常のウィンドウメッセージは、正確なコントロールを駆動する最適な解決策ではありません。彼らはOSの加速システムを継承し、クリッピングし、あなたが見ることができるように他のフェナニガンに依存します。

マウス入力を受け取るのに最適なAPIは未処理入力です。ハードウェアが提供できるより良いdpiとポーリングレートを公開する利点があり、ボンネット操作の下では自由に使用できます。これでマウスを読むと、SetCaptureとclipCursorを自由に使用して、他のウィンドウへの望ましくないクリックを防ぐことができます。

あなたがここにドキュメントを見つけることができます。Windowsのデスクトップアプリのhttps://msdn.microsoft.com/en-us/library/windows/desktop/ms645536(v=vs.85).aspx

4

を、ちょうどあなたの窓の四角形を与えるClipCursorを使用します。

RECT rect; 
    GetClientRect(mWindow, &rect); 

    POINT ul; 
    ul.x = rect.left; 
    ul.y = rect.top; 

    POINT lr; 
    lr.x = rect.right; 
    lr.y = rect.bottom; 

    MapWindowPoints(mWindow, nullptr, &ul, 1); 
    MapWindowPoints(mWindow, nullptr, &lr, 1); 

    rect.left = ul.x; 
    rect.top = ul.y; 

    rect.right = lr.x; 
    rect.bottom = lr.y; 

    ClipCursor(&rect); 

ので、このモードを脱出する方法を持っているようにしてくださいユーザーは必要に応じて他のウィンドウと対話することができます。通常、このような「マウスルック」の問題を解決するために「一時停止」メニューに移動すると、ClipCursor(nullptr);に電話をかけます。

デスクトップアプリでも「生」入力を使用できます(Taking Advantage of High-Definition Mouse Movementを参照)。生の入力は、相対的な動きの「マウスルック」の動作にはうまくいくが、(a)リモートデスクトップでは機能しないし、(b)「ポインタ弾道」は得られない非線形の移動速度でマウスをより敏捷にするので、絶対移動を扱うときには通常、伝統的なメッセージであるWM_MOUSEに固執する必要があります。 WM_INPUTに相当するものがないよう

は、ユニバーサルのWindowsプラットフォームの場合、あなたは「生の」入力を使用することはできませんが、 MouseDeltaプロパティによって MouseDevice.MouseMovedイベントのうち、高精度なデータを入手できます。 UWPでの相対移動に ClipCursorを使用する必要はありません。 CoreWindow.PointerCursorプロパティをnullptrに設定してカーソルをオフにするだけで、システムマウスの位置が追跡されなくなります。ここでも、「一時停止」メニューに入っているときにシステムカーソルを復元する必要があります。 Developing mouse controls (DirectX and C++)を参照してください。

のDirectXツールキットMouseヘルパークラスともっと重要なimplementationファイルを参照してください。相対モードでは、WindowsデスクトップのWin32実装ではClipCursorWM_INPUTの両方を使用します。

関連する問題