C ++ WinAPI - небрежный ввод мышью

0

Итак, я делаю игру в C++ с OpenGL, и я хочу, чтобы мой курсор оставался посередине экрана.

В начале каждого кадра я вызываю

POINT pt;
pt.x = 400;
pt.y = 300;
ClientToScreen(hWnd, &pt);
SetCursorPos(pt.x, pt.y);

Затем, на мероприятии WM_MOUSEMOVE, которое я делаю

POINT p;
GetCursorPos(&p);
ScreenToClient(hWnd, &p);
dx = p.x - 400;
dy = p.y - 300;

Окно размером 800x600, поэтому я просто написал эти цифры, которые, очевидно, будут изменены позже.

Он работает, но он очень неряшлив. Как если бы некоторые кадры были сброшены.

  • 2
    Не пытайся сделать это. Мышь и ее курсор являются общим ресурсом, и отдельные приложения не могут повторно перемещать их. Если вы хотите, чтобы нечто, похожее на курсор мыши, появилось в середине вашего окна, то скройте реальный курсор и нарисуйте то, что вы хотите, там, где вы хотите.
  • 0
    Я хотел поместить курсор в окно, чтобы я мог использовать параметры перемещения для движения камеры в камере от первого лица
Показать ещё 3 комментария
Теги:
winapi

2 ответа

1
Лучший ответ

Вы можете использовать ClipCursor() чтобы ограничить движение мыши. Мышь не сможет перемещаться за пределы указанного прямоугольника, пока вы его не отпустите.

  • 0
    хорошо, это работает, но как мне справиться, если мышь находится на границах? я тоже хочу повернуть, если он на грани. потому что теперь, если я двигаюсь за пределы клиента, и он не выходит, поэтому нет дельты, но я хочу повернуть камеру
  • 0
    Сделайте прямоугольник клипа немного больше, чем ваше окно, а затем используйте SetCapture() для получения сообщений мыши, таких как WM_MOUSEMOVE и WM_LBUTTONUP , даже когда мышь находится за пределами вашего окна. Или просто забудьте ClipCursor() и используйте SetCapture() , чтобы у пользователя было больше возможностей для свободного перемещения. В любом случае, захватите мышь, когда левая кнопка удерживается на вашем окне, затем отпустите захват, когда кнопка будет отпущена. Вы можете вычислить дельты на основе перемещений между сообщениями или расстояния между координатами сообщения мыши и координатами вашего окна.
0

Вы можете попробовать установить крючок через SetWindowsHookEx (передавая WH_MOUSE или, возможно, даже WH_MOUSE_LL), и просто отбрасывать все события перемещения до отправки соответствующих сообщений окна.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню