繁体   English   中英

如何在鼠标滚轮事件上获取鼠标位置

[英]How to get mouse position on mouse wheel event

MouseMotionEvent相反, MouseWheelEvent不提供鼠标位置(字段xy用于水平和垂直滚动)。

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)

似乎运动事件是相对于纹理或渲染器(在窗口中缩放和居中)表示的,而状态是相对于窗口以像素表示的。

有没有一种方法可以使当前鼠标状态与鼠标事件中填充的位置相匹配?

我最终通过手动转换坐标:

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)

在处理wheel事件时(而不是在生成事件时)会捕获鼠标位置,因此非常准确。 但是我认为我们不能用当前的API做得更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM