Могу ли я отследить свою позицию мыши за пределами окна SDL? - PullRequest
0 голосов
/ 01 октября 2019

Я строю часы с SDL, это окно без рамки. Теперь я все еще хочу перемещать часы по экрану, поэтому я написал функцию для их перемещения. В основном он ожидает ввода mousedown, а затем вычисляет пройденное расстояние до тех пор, пока вы не отпустите кнопку мыши. Затем он перемещает окно. Проблема в том, что он получает мышиную мышку ВНУТРИ моего окна с часами, поэтому я могу просто переместить его, если щелкнуть по левому верхнему углу, а затем переместиться в нижний правый угол окна с часами.

sPos moveClock(int event){
    if(event==-1&&mPos.x==0&&mPos.y==0){
        mPos = setPos(gvMousePos.x,gvMousePos.y);
        cout << "down" << endl;
    }
    if(event==-65){
        mPos = setPos(gvMousePos.x-mPos.x,gvMousePos.y-mPos.y);
        cout << "up" << endl;
        sPos temPos = mPos;
        mPos = setPos(0,0);
        return temPos;
    }
    return setPos(0,0);
}

Я быМне нравится иметь возможность перемещать мои часы в любом месте экрана, поэтому мне нужен способ, чтобы получить мышиную мышку даже за пределами окна. Или способ рассчитать расстояние во время mousedown, даже если я выхожу за пределы окна, созданного SDL.

1 Ответ

1 голос
/ 01 октября 2019

SDL_CaptureMouse():

\brief Захват мыши для отслеживания ввода вне окна SDL.

\param включено Независимо от того, включено или нетдля включения захвата

Захват позволяет вашему приложению получать события мыши глобально, а не только внутри вашего окна. Не все видеоцелевые объекты поддерживают эту функцию. Когда захват включен, текущее окно будет получать все события мыши, но в отличие от относительного режима, курсор не изменяется и не ограничивается вашим окном.

Эта функция может также запретить ввод данных мышью в другие окна - как в вашем приложении, так и в других - в системе - поэтому вам следует использовать эту функцию экономно и небольшими пакетами. Например, вы можете отслеживать мышь, пока пользователь что-то перетаскивает, пока пользователь не отпустит кнопку мыши. Не рекомендуется захватывать мышь в течение длительных периодов времени, например, в течение всего времени работы приложения.

Во время захвата события мыши по-прежнему сообщают координаты относительно текущего (переднего плана) окна, но этикоординаты могут находиться за пределами окна (включая отрицательные значения). Захват разрешен только для переднего окна. Если окно теряет фокус во время захвата, захват будет отключен автоматически.

Пока захват включен, в текущем окне будет установлен флаг SDL_WINDOW_MOUSE_CAPTURE.

\return 0 в случае успехаили -1, если не поддерживается.

extern DECLSPEC int SDLCALL SDL_CaptureMouse(SDL_bool enabled);
...