2012-01-23 18 views
1

私はDX11ゲームで作業しており、フルスクリーンモードでカーソルをフルスクリーンウィンドウにクリップしたいと思います。この方法を使用しますClipCursorが機能していません


void MyClass::_SetupCursor(BOOL bFullscreen) { 
    // Clip cursor if requested 
    if(bFullscreen) { 
     if(m_bShowCursorWhenFullscreen) { 
      ShowCursor(m_bShowCursorWhenFullscreen); 
     } 
     if(m_bClipCursorWhenFullscreen) { 
      // Confine cursor to full screen window 
      RECT windowRect; 
      GetWindowRect(m_hWnd, &windowRect); 
      ClipCursor(&windowRect); 
     } 
    } 
    else { 
     ShowCursor(TRUE); 
     ClipCursor(NULL); 
    } 
} 

ただし、2つのモニタでフルスクリーンモードになっても、マウスをもう一方のモニタに移動することはできます。解像度をフルスクリーンモードで2048x1152に設定すると、ウィンドウの矩形が1360x768になり、それがクリップされます。 GetClippedRectを使用してクリップされていることを確認します。

1)なぜマウスが私の窓はであるモニターにクリップなっていません。

だから私は2つの質問がありますか?

2)モニタが2048x1152であり、解像度が2048x1152に設定されていることがわかっている場合、ウィンドウの長方形が1360x768と測定されるのはなぜですか?

+0

カーソルを隠すのではなく、クリップするのはなぜですか? –

+0

@CodyGrayクリップされていないとカーソルが隠れてしまうことはありません...全画面ウィンドウにカーソルを置く必要があります。多くのゲームにはこの機能があります。はい、私はそれらがウィンドウのカーソルを隠していることを知っていますが、実際にはそれほど違いはありません。私はカーソルをまだ置き換えていない。 – Darkhydro

+0

この関数呼び出しを完全に避けてください。実際にカーソルをエミュレートする必要があります。その理由は、アプリケーションが不明瞭に(segfault/exception/access violation/whatever)Windowsがクリップ境界を保持する場合(少なくとも<= Windows XPの場合)です。あなたが絶対にシステムカーソルに境界チェックを含めるには、代わりに 'SetCursorPosition'を使用してそれを制限してください。 –

答えて

3

ClipCursorを使用するには、すべてのDX11バッファとウィンドウサイズが正しいことが必要です。私は、フルスクリーンでアプリケーションを実行し、それを切り替えずに、これを見つけました。そして、複数のモニタでも、ClipCursorは正常に機能しました。 ClipCursorが失敗するときの詳細については、stackoverflowに関する私の他の質問をチェックしてください:Why is D3D10SDKLayers.dll loaded during my DX11 game?

ClipCursorは、その質問で説明する状況が発生するたびに失敗します。また、私の2番目の質問に答えて、私はリンクされた質問で説明する状況のため、ウィンドウのサイズが正しくありません。

0

残念ながらdocumentation(ユーザーによる)のコメントによると、これはマルチモニタの設定では機能しないようです。画面外に出たときにマウスの位置を変更し、そのレンダリングをオフにしてから、カーソルをウィンドウに戻すときにマウスを戻す(マウスがウィンドウから離れるかどうかを検出するためのメソッドを開発したり、そうでない場合は、そのためのウィンドウメッセージがあります)。

+0

これを受け入れることを躊躇しています。私が見たDX11サンプルの中には、複数のモニタでもカーソルを正しくクリップするものがあるからです。さらに、http://msdn.microsoft.com/en-us/library/windows/desktop/ms648383(v=vs.85).aspxでは、マルチモンではサポートされていないとは言えません。 – Darkhydro

+0

DX11サンプルでは、​​ClipCursor以外のものでカーソルをクリッピングする可能性のある追加のAPI(DXUT)が使用されています。おそらく彼らは何か追加しているのでしょうか? – josephthomas

+0

いいえ、私はDXUTと同じことをやっています。おかげで助けを借りて、私はこれが私が持っている別の問題の一部であることがわかったstackoverflow @ http://stackoverflow.com/questions/8934374/why-is-d3d10sdklayers-dll-loaded-during-my -dx11-ゲーム。私はClipCursorとは関係がないので、この質問を削除します - ClipCursorは正常に動作します。 – Darkhydro

関連する問題