gpt4 book ai didi

c++ - SDL Window 最小化后无法恢复

转载 作者:太空狗 更新时间:2023-10-29 23:04:38 25 4
gpt4 key购买 nike

问题发生在

SDL_RestoreWindow(gameWindow);

在最小化窗口上调用。窗口不会重新出现。

我制作了一个小虚拟程序来模拟我的主程序正在调用的那种 SDL 调用,然后问题重现了。这是代码:

#include <SDL.h>

int main(int argn, char **argv)
{
// The windows
SDL_Window *gameWindow;

// Initialise
SDL_Init(SDL_INIT_EVERYTHING);

// Create window
gameWindow = SDL_CreateWindow(
"Game Window",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640,
480,
SDL_WINDOW_OPENGL
);

// Minimise/ hide or whatever?
SDL_MinimizeWindow(gameWindow);

// Wait
SDL_Delay(1000);

// Attempt to bring back the window
SDL_RestoreWindow(gameWindow);

// program would run here
SDL_Delay(1000);

// quit out
SDL_DestroyWindow(gameWindow);

// Clean up
SDL_Quit();
return 0;
}

关于为什么这个 gameWindow 没有重新出现的任何想法?SDL_Restore 不是为了恢复最小化的窗口而设计的吗?

另外仅供引用这是在 Ubuntu 13.10 上运行并使用 gcc 4.8.1 和 Gnome metacity 2.34.13 编译

最佳答案

简答

确保调用让 SDL 处理事件的函数之一:SDL_PollEvent()SDL_WaitEvent()SDL_PumpEvents()

更长的答案

窗口无法恢复的原因可能是因为它没有分配SDL_WINDOW_MINIMIZED标志。

这是 source code SDL_RestoreWindow() 函数:

void
SDL_RestoreWindow(SDL_Window * window)
{
CHECK_WINDOW_MAGIC(window,);

if (!(window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED))) {
return;
}

if (_this->RestoreWindow) {
_this->RestoreWindow(_this, window);
}
}

如果 SDL_WINDOW_MAXIMIZEDSDL_WINDOW_MINIMIZED 都没有设置,则 _this->RestoreWindow() 将不会被调用(并且窗口也不会被恢复)。

通常当窗口被最小化时,SDL_WINDOW_MINIMIZED 标志由 SDL 在 SDL_SendWindowEvent() 中设置 function :

    case SDL_WINDOWEVENT_MINIMIZED:
if (window->flags & SDL_WINDOW_MINIMIZED) {
return 0;
}
window->flags &= ~SDL_WINDOW_MAXIMIZED;
window->flags |= SDL_WINDOW_MINIMIZED;
SDL_OnWindowMinimized(window);
break;

这会在 SDL 处理事件队列时发生。事件的处理应由您的应用程序触发,如 documentation 中所述。 :

Internally, SDL stores all the events waiting to be handled in anevent queue. Using functions like SDL_PollEvent(), SDL_PeepEvents()and SDL_WaitEvent() you can observe and handle waiting input events.

如果不想接收和处理输入事件,可以调用SDL_PumpEvents() function让 SDL 处理事件:

This function updates the event queue and internal input device state.

Often the need for calls to SDL_PumpEvents() is hidden from the user since SDL_PollEvent() and SDL_WaitEvent() implicitly call SDL_PumpEvents(). However, if you are not polling or waiting for events (e.g. you are filtering them), then you must call SDL_PumpEvents() to force an event queue update.

关于c++ - SDL Window 最小化后无法恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22251146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com