在 SDL 2 中获取连续的窗口调整大小事件

Posted

技术标签:

【中文标题】在 SDL 2 中获取连续的窗口调整大小事件【英文标题】:Getting Contiunous Window Resize Event in SDL 2 【发布时间】:2015-11-24 12:34:24 【问题描述】:

我使用以下结构来获取调整大小的 SDL 窗口的新宽度和高度。但是使用这种结构,我只能在调整大小完成后才能获得新数据,即当我完成拖动并释放鼠标按钮时。怎么才能连续获取新数据,就是在拖拽窗口的时候。

if (sdl_set->GetMainEvent()->type == SDL_WINDOWEVENT)

  if (sdl_set->GetMainEvent()->window.event == SDL_WINDOWEVENT_RESIZED)
  
    ScreenWidth = sdl_set->GetMainEvent()->window.data1;
    ScreenHeight = sdl_set->GetMainEvent()->window.data2;
    cout << "Window Resized!" << endl;
  

【问题讨论】:

试试SDL_WINDOWEVENT_SIZE_CHANGED SDL_WINDOWEVENT_SIZE_CHANGED 未记录为提供连续调整大小更新。并且实验上(在mac os x上)它没有。我也想知道如何在用户手势期间获得连续的调整大小事件! wiki.libsdl.org/SDL_WindowEventID 实际上是不可能的,因为这个bug:bugzilla.libsdl.org/show_bug.cgi?id=2077 SDL_SetWindowsMessageHook 会在每条 Windows 消息上调用提供的函数,在 TranslateMessage 之前。 【参考方案1】:
static int resizingEventWatcher(void* data, SDL_Event* event) 
  if (event->type == SDL_WINDOWEVENT &&
      event->window.event == SDL_WINDOWEVENT_RESIZED) 
    SDL_Window* win = SDL_GetWindowFromID(event->window.windowID);
    if (win == (SDL_Window*)data) 
      printf("resizing.....\n");
    
  
  return 0;


int main() 
    SDL_Window* win = ...
    ...
    SDL_AddEventWatch(resizingEventWatcher, win);
    ...

使用 SDL 的 EventWatch 可以解决。

【讨论】:

@pergy 在这种情况下,没有太大区别.. 但我认为这是因为这将创建一个线程,始终执行。我认为 @pergy 回复迟了,但刚刚看到这个。不同之处在于事件监视由发出事件本身的线程(可能是系统/操作系统线程)调用。在这种情况下,事件泵在调整大小操作上被阻止,而在调整大小完成时不会返回。与此同时,大小更改事件正在排队,但它们正在排队当前调整大小操作之后。添加一个事件监视器来监听这些事件可以有效地在不同的线程上处理它们,让您有机会重新绘制。不过要注意线程安全!【参考方案2】:

如果你在 Windows 上,你是否尝试过使用 windows api?

我知道这不是一个真正的解决方案,但如果你不是在制作跨平台应用程序,你应该试一试。

使用 HWND 查找 SDL 的窗口并返回窗口大小。

【讨论】:

以上是关于在 SDL 2 中获取连续的窗口调整大小事件的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 和 SDL 处理窗口大小调整

如何使用子窗口中的句柄获取父窗口的调整大小事件?

在窗口调整大小时调整图像地图大小

JavaScript 窗口大小调整事件

css - 如何在调整窗口大小时连续制作弹性项目3并保持1:1的比例[重复]

在窗口调整大小事件