Как определить положение мыши на колесе мыши

Вопреки MouseMotionEvent, MouseWheelEvent не предоставляет местоположение мыши (поля x а также y вместо этого используются для горизонтальной и вертикальной прокрутки).

SDL обеспечивает SDL_GetMouseState() получить текущую позицию мыши, но она не выражена в той же системе координат:

SDL_Event event;
while (SDL_WaitEvent(&event)) {
    switch (event.type) {
        case SDL_MOUSEMOTION: {
            int x, y;
            SDL_GetMouseState(&x, &y);
            printf("event=(%d, %d) state=(%d, %d)\n",
                      event.motion.x, event.motion.y, x, y);
        }
    }
}

Когда я двигаю мышь, она печатает что-то вроде:

event=(700, 184) state=(479, 126)
event=(702, 175) state=(480, 120)
event=(706, 168) state=(485, 111)

Кажется, что событие движения выражается относительно текстуры или средства визуализации (которое масштабируется и центрируется в окне), в то время как состояние выражается относительно окна в пикселях.

Есть ли способ получить текущее состояние мыши, соответствующее положению, заполненному событиями мыши?

1 ответ

Я закончил преобразованием координат вручную:

void convert_to_renderer_coordinates(SDL_Renderer *renderer, int *x, int *y) {
    SDL_Rect viewport;
    float scale_x, scale_y;
    SDL_RenderGetViewport(renderer, &viewport);
    SDL_RenderGetScale(renderer, &scale_x, &scale_y);
    *x = (int) (*x / scale_x) - viewport.x;
    *y = (int) (*y / scale_y) - viewport.y;
}

Я использую эту функцию для преобразования координат состояния мыши:

SDL_Event event;
while (SDL_WaitEvent(&event)) {
    switch (event.type) {
        case SDL_MOUSEMOTION: {
            int x, y;
            SDL_GetMouseState(&x, &y);
            convert_to_renderer_coordinates(&x, &y);
            printf("event=(%d, %d) state=(%d, %d)\n",
                      event.motion.x, event.motion.y, x, y);
        }
    }
}

Теперь они совпадают:

event=(1033, 14) state=(1033, 14)
event=(1034, 13) state=(1034, 13)
event=(1034, 11) state=(1036, 10) // this is racy, state already has a new position
event=(1036, 10) state=(1036, 10)

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

Другие вопросы по тегам