1

我正在开发 DX11 游戏,我想在全屏模式下将光标剪辑到全屏窗口。我用这个方法


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) 当我知道显示器是 2048x1152 并且我将分辨率设置为 2048x1152 时,为什么窗口矩形测量为 1360x768?

4

2 回答 2

3

事实证明,要使 ClipCursor 工作,您必须拥有所有 DX11 缓冲区和正确的窗口大小。我通过首先全屏运行我的应用程序而不切换到它来发现这一点,并且 ClipCursor 工作得很好,即使有多个显示器。有关 ClipCursor 何时失败的更多信息,请查看我在 stackoverflow 上的另一个问题:为什么在我的 DX11 游戏期间加载了 D3D10SDKLayers.dll?.

每当我在那个问题中描述的情况出现时,ClipCursor 都会失败。另外,在回答我的第二个问题时,由于我在链接问题中描述的情况,窗口大小不正确。

于 2012-01-24T00:19:57.683 回答
0

不幸的是,根据(用户)对文档的评论,这似乎不适用于多显示器设置。您可能想要开发一种方法,当鼠标离开屏幕时重新定位鼠标,关闭它的渲染,然后在将光标移回窗口时重新打开它(以检测鼠标是否移出窗口或不,有Windows消息)。

于 2012-01-23T22:17:14.730 回答