陷阱光标在窗口中

use*_*806 2 c++ windows mouse camera directx-11

我使用DX11在C++中编写了自己的cameraclass.目前我使用WM_MOUSEMOVE事件在场景中环顾四周.为了防止cursur离开窗口,每当发生WM_MOUSEMOVE事件时,我都会调用SetCursorPos函数使鼠标居中.但是如果我快速移动鼠标,光标就会离开窗口.解决方法是使用ClipCursor函数,但是当光标碰到rect的边界时,这会导致相机的旋转动摇.所以ClipCursor解决了原来的问题,但在另一个问题上结束了.

你们有解决方法吗?

Chu*_*urn 5

对于Windows桌面应用程序,只需使用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);
Run Code Online (Sandbox Code Playgroud)

确保有办法逃避此模式,以便用户可以根据需要选择与其他窗口进行交互.通常情况下,ClipCursor(nullptr);当您进入"暂停"菜单时,您可以通过这种方式退出"鼠标外观"行为.

您也可以在桌面应用程序中使用"原始"输入,请参阅利用高清鼠标移动.请记住,原始输入对于相对移动的"鼠标外观"行为非常有效,但是(a)它不能在远程桌面上工作,并且(b)你不会得到'指针 - 弹道'这是一个非线性移动速率,使鼠标更敏捷,所以你应该WM_MOUSE在处理绝对移动时坚持传统的信息.

对于通用Windows平台,您不能使用"原始"输入,因为没有相应的WM_INPUT,但您MouseDevice.MouseMoved通过该MouseDelta属性从事件中获得高精度数据.您不需要ClipCursor在UWP中使用相对移动,只需通过将CoreWindow.PointerCursor属性设置为nullptr 来关闭光标将阻止跟踪系统鼠标位置.同样,您应该在"暂停"菜单中恢复系统光标.请参阅开发鼠标控件(DirectX和C++).

请参阅DirectX工具包 鼠标助手类,更重要的是实现文件.对于相对模式,它使用两者ClipCursorWM_INPUT用于Windows桌面Win32实现.