我正在做一个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 );
    }
}

但是,当我在全屏模式下使用两个监视器时,我仍然可以将鼠标移到另一个监视器上。在全屏模式下,分辨率设置为2048x1152,我得到的窗口矩形为1360x768,这就是它被裁剪的地方。我确认它是用getclippedrect剪裁的。
所以我有两个问题:
1)为什么鼠标没有被夹在我的窗口所在的监视器上?
2)当我知道监视器是2048x1152,并且分辨率设置为2048x1152时,为什么窗口矩形的测量值是1360x768?

最佳答案

事实证明,要让clipcursor工作,您必须拥有所有的dx11缓冲区和正确的窗口大小。我发现这一点,我的应用程序运行在全屏第一,没有切换到它,和clipcursor工作得很好,即使有多个显示器。有关clipcursor何时失败的更多信息,请查看stackoverflow上的其他问题:Why is D3D10SDKLayers.dll loaded during my DX11 game?
当我在这个问题中描述的情况出现时,clipcursor将永远失败。另外,在回答我的第二个问题时,由于我在链接问题中描述的情况,窗口大小不正确。

10-07 22:49