Получение позиции мыши в окне - PullRequest
0 голосов
/ 16 мая 2018

Я ищу положение курсора во время основного цикла моего приложения / игры.

Из некоторых исследований, похоже, есть два способа сделать это: во-первых, прослушивание события 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);

Будем благодарны за любые указатели, советы или информацию.

Редактировать: Окно приложений не развернуто и / или поверх панели задач.Проблема возникает на обеих осях, х и у.Я заметил, что строка заголовка вверху удерживает позицию y на 0, пока курсор находится внутри нее.Есть ли способ добраться до области визуализации экрана?При создании окна с разрешением, в котором я хочу запустить мою игру, я ожидаю, что бит посередине (не уверен в реальной терминологии - бит без границ и строки заголовка) будет соответствовать разрешению.

1 Ответ

0 голосов
/ 16 мая 2018

Область внутри окна (исключая строку заголовка и границы и т. Д.) Называется клиентской областью.WM_MOUSEMOVE сообщения дадут вам координаты в клиентской области, которая будет в (0, 0) в верхнем левом углу этой внутренней части.

GetCursorPos вернет позицию курсора мыши в пространстве экрана(поэтому ваш звонок на ScreenToClient правильный).Поскольку окно не развернуто, и вы по-прежнему указываете границу (WS_OVERLAPPEDWINDOW определяется как WS_OVERLAPPED | WS_THICKFRAME | etc..., и вы удаляете WS_THICKFRAME, но WS_OVERLAPPED по-прежнему включает границу), я предполагаю, что окномакет, включая границу, сожрет лишние 20 пикселей.Если вы создаете полноэкранное окно без полей (такого размера и размера, чтобы заполнить экран и используя только стиль WS_POPUP), вы должны увидеть клиентскую область, заполняющую доступное пространство.

...