在窗口中获取鼠标位置

时间:2018-05-16 15:58:34

标签: c++ winapi directx game-development

我希望在应用程序/游戏的主循环期间获取光标位置。

通过一些研究,似乎有两种方法可以做到这一点: 首先侦听WM_MOUSEMOVE事件并检查lParam。 其次使用GetCursorPos()然后使用ScreenToClient()跟进它。

我有一个设置为1680x1050的窗口,但是当查看来自任一方法的数据时,我最终在窗口的右侧显示大约1660的值。

我找不到任何资源可以解释为什么会这样,我想知道它是否与窗口创建有关?

这是我用来为我的应用程序创建窗口的代码

//Register the window class
WNDCLASS windowClass;
windowClass = {};
windowClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = handleWindowMessages;
windowClass.hInstance = hInstance;
windowClass.hCursor = LoadCursor(nullptr, IDC_ARROW);
windowClass.lpszClassName = L"D3D11 Rendering";
if (!RegisterClass(&windowClass))
{
    return 0;
}

//Create the window
HWND windowHandle
    = CreateWindowEx(0,
        windowClass.lpszClassName,
        L"D3D11 Rendering", 
        (WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME) | WS_VISIBLE,         //According to stackoverflow.com WS_OVERLAPPEDWINDOW ^ (XOR) WS_THICKFRAME will prevent window resizing
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        gResolutionX,
        gResolutionY,
        0, 0, hInstance, 0);

然后在主循环中,我正在执行以下操作:

POINT p;
GetCursorPos(&p);
ScreenToClient(windowHandle, &p);

任何指针,提示或信息都将不胜感激。

编辑:应用程序窗口未最大化和/或通过任务栏。问题出现在轴x,y上。我注意到顶部的标题栏将y位置保持为0,同时光标位于其中。有没有办法进入屏幕的可渲染区域?当创建具有我希望我的游戏运行的分辨率的窗口时,我期望中间的位(不确定实际术语 - 没有边框和标题栏的位)以匹配分辨率。

1 个答案:

答案 0 :(得分:0)

窗口内的区域(标题栏和边框除外等)称为客户区。 WM_MOUSEMOVE消息将在客户区中为您提供坐标,该坐标位于该内部左上角的(0,0)处。

GetCursorPos将在屏幕空间中返回鼠标光标位置(因此您对ScreenToClient的调用是正确的)。由于窗口未最大化,并且您仍在指定边框(WS_OVERLAPPEDWINDOW定义为WS_OVERLAPPED | WS_THICKFRAME | etc...,并且您要移除WS_THICKFRAME,但WS_OVERLAPPED仍然包含我的猜测是窗口的布局,包括边框,会消耗额外的20像素。如果您创建一个全屏,无边框窗口(如此大小和位置以填充屏幕,并仅使用WS_POPUP样式),您应该看到客户区填充可用空间。