SDL2:如何正确切换全屏?

时间:2015-06-03 19:36:29

标签: sdl fullscreen sdl-2

我在使用我的程序停用全屏模式时遇到问题。输入全屏正确,但尝试返回窗口模式不起作用,唯一的效果是光标再次显示。

这是为我重现问题的MCVE / SSCCE:

void ToggleFullscreen(SDL_Window* Window) {
    Uint32 FullscreenFlag = SDL_WINDOW_FULLSCREEN;
    bool IsFullscreen = SDL_GetWindowFlags(Window) & FullscreenFlag;
    SDL_SetWindowFullscreen(Window, IsFullscreen ? 0 : FullscreenFlag);
    SDL_ShowCursor(IsFullscreen);
}

int main() {
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window* Window = SDL_CreateWindow("",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);

    bool Exit = false;
    for (SDL_Event Event; !Exit;) {
        SDL_WaitEvent(&Event);
        if (Event.type == SDL_KEYDOWN) {
            switch (Event.key.keysym.sym) {
                case SDLK_f: ToggleFullscreen(Window); break;
                case SDLK_q: Exit = true; break;
            }
        }
    }
    SDL_DestroyWindow(Window);
    SDL_Quit();
}

SDL_SetWindowFullscreen返回0,就像操作成功一样。我究竟做错了什么? (我在OS X 10.10.3上使用SDL 2.0.3。)

3 个答案:

答案 0 :(得分:6)

这看起来像一个已知问题。希望SDL开发人员能够修复它。我发现了以下错误报告。

https://bugzilla.libsdl.org/show_bug.cgi?id=2479

答案 1 :(得分:2)

即使是现在,SDL_SetWindowFullscreen仍然存在问题。我尝试使用此功能为我的视频播放器添加全屏功能。但是,在全屏和窗口模式之间转换时会随机崩溃。

我发现暂时的工作现在似乎正常工作。

SDL_DisplayMode dm;

if (SDL_GetDesktopDisplayMode(0, &dm))
{
    printf("Error getting desktop display mode\n");
    return -1;
}

if (SDL_PollEvent(&event))
{
    switch (event.type)
    {
        case SDL_KEYUP:
            switch (event.key.keysym.sym)
            {
                case SDLK_f:
                    SDL_RestoreWindow(screen); //Incase it's maximized...
                    SDL_SetWindowSize(screen, dm.w, dm.h + 10);
                    SDL_SetWindowPosition(screen, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
            }
            break;
    }
}

它基本上是"假的"全屏。它调整窗口大小,使客户区覆盖整个屏幕,最小化,最大化,退出按钮不在屏幕上。

希望这有帮助。

答案 2 :(得分:0)

我知道这可能是 5 年后的日期,但我遇到了同样的问题,我发现您的代码方式比需要的更复杂。所以我只是想补充一下:

//somewhere outside the loop
bool isFullScreen = true;

void toggleFullScreen(SDL_Window* window, bool currentState)
{
    isFullScreen = !currentState;

    SDL_SetWindowFullscreen(window, !currentState);
    SDL_ShowCursor(currentState);
}

只需将 isFullscreen 放在 currenState 上,您就可以通过按键事件进行良好的切换。