c++ - SDL 切换全屏显示框架

标签 c++ sdl

在全屏切换 SDL 应用程序到窗口和返回时遇到问题:

SDL_SetVideoMode( (int)screenSize.x, (int)screenSize.y, 32, SDL_NOFRAME | SDL_FULLSCREEN | SDL_OPENGL );
// now upload all active textures back into the GPU

// toggle from fullscreen to windowed
SDL_SetVideoMode( (int)screenSize.x, (int)screenSize.y, 32, SDL_OPENGL );

这里的问题是“SDL_NOFRAME”标志似乎不起作用 - 我实际上在全屏应用程序中看到了一个框架!

注意:“框架”是指标题栏上带有应用程序名称的 Windows 窗口框架,以及最小化、恢复和关闭按钮。

如果我直接以全屏或窗口模式启动应用程序,一切正常,只是切换不起作用。如果我对窗口模式和全屏模式都使用 SDL_NOFRAME,它会按预期工作,但这不是我想要的。

编辑: 可以在此处阅读此功能的文档: http://www.libsdl.org/cgi/docwiki.cgi/SDL_SetVideoMode

从Fullscreen -> Windowed -> Fullscreen,报错如上。 从窗口->全屏, 结果略有不同,我看到一个黑条而不是框架...

最佳答案

您使用的是哪个版本的 SDL?我假设它是 SDL-1.2.14 并在该版本上尝试了以下操作:

#include "SDL.h"

int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Surface *screen;
#if 1
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
    SDL_Delay(2000);
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL | SDL_FULLSCREEN);
    SDL_Delay(5000);
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
    SDL_Delay(5000);
#else
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL | SDL_FULLSCREEN);
    SDL_Delay(2000);
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
    SDL_Delay(5000);
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL | SDL_FULLSCREEN);
    SDL_Delay(5000);
#endif

    SDL_Quit();
    return 0;
}

代码从 windowd 到全屏然后返回或相反,这取决于预处理器标志集。

在全屏模式下我没有得到一个窗口框架,而当省略 SDL_FULLSCREEN 时有一个窗口框架。我还将 SDL_SetVideoMode 的返回值分配给一个变量,因为这可能会改变。当切换到全屏窗口时,可能仍会显示您在窗口模式下碰巧显示的屏幕内容。在全屏模式下,我看到了位于屏幕左上角的 SDL_app 窗口。您必须清空屏幕以确保只显示您自己的内容。

还有一个 SDL_WM_ToggleFullscreen功能。它在 Windows 上不起作用,但文档链接包含一个示例,说明如何以可移植的方式处理切换窗口/全屏。 SDL 文档中的代码示例如下所示:

/* Anyone may copy and alter this fragment of pseudo-code and use it however they wish */
#include "SDL.h" /* The only library needed to do this */

Uint32 flags = SDL_SWSURFACE; /* Start with whatever flags you prefer */
SDL_Surface *screen = SDL_SetVideoMode(640, 480, 32, flags); /* Start with whatever settings you prefer */

/* -- Portable Fullscreen Toggling --
As of SDL 1.2.10, if width and height are both 0, SDL_SetVideoMode will use the
width and height of the current video mode (or the desktop mode, if no mode has been set).
Use 0 for Height, Width, and Color Depth to keep the current values. */

flags = screen->flags; /* Save the current flags in case toggling fails */
screen = SDL_SetVideoMode(0, 0, 0, screen->flags ^ SDL_FULLSCREEN); /*Toggles FullScreen Mode */
if(screen == NULL) screen = SDL_SetVideoMode(0, 0, 0, flags); /* If toggle FullScreen failed, then switch back */
if(screen == NULL) exit(1); /* If you can't switch back for some reason, then epic fail */

该示例没有提及在切换窗口模式时使用 SDL_OPENGL 标志时会发生什么。我担心 OpenGL 上下文可能会被破坏并重新创建,这意味着您必须重新初始化 OpenGL 并在切换时重新加载所有纹理和几何图形 窗口模式。

编辑:

我能够确认,OpenGL 上下文在切换显示模式后被破坏:

创建显示列表

GLuint list = glGenLists(1);
glNewList(list, GL_COMPILE);
glBegin(GL_LINES);
glVertex2f(0.0f, 0.0f);
glVertex2f(1.0f, 1.0f);
glEnd();
glEndList();

并调用它

glClear(GL_COLOR_BUFFER_BIT);
glCallList(list);

成功了。在调用相同列表的 SDL_SetVideoMode 之后没有绘制任何内容。

关于c++ - SDL 切换全屏显示框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8367653/

相关文章:

c++ - SDL 中的 F12 键导致断点?

c - 图像的聚焦

c++ - 如何构建用于分发的 SDL C++ 程序?

c++ - SDL2 和 OpenGL 模板缓冲区不起作用

c++ - (msvcr120d.dll) 处的未处理异常

c++ - 贯穿整个项目的一种方法

c++ - C++ 中奇怪的自动引用

c++ - 从 std::function 获取对象上下文

c++ - 如何配置 Clion 以使用 SDL2?

c++ - vector 中的匿名构造函数和析构函数调用