Как определить положение мыши на колесе мыши
Вопреки 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.