【问题标题】:SDL2: How to properly toggle fullscreen?SDL2:如何正确切换全屏?
【发布时间】:2015-06-03 19:36:29
【问题描述】:

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

这是为我重现该问题的 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。)

【问题讨论】:

    标签: sdl fullscreen sdl-2


    【解决方案1】:

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

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

    【讨论】:

    • v2.0.4 分支中似乎有针对该错误的补丁。我想我会等到它发布。
    【解决方案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;
        }
    }
    

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我知道这可能是日期之后的 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 上,您就可以通过按键事件进行良好的切换。

      【讨论】:

      • SDL_SetWindowFullscreen 不带布尔值。它接受 SDL_WINDOW_FULLSCREEN、SDL_WINDOW_FULLSCREEN_DESKTOP 或 0。
      • 实际上,它确实需要一个布尔值。它需要一个 1 或一个 0。这就是您通过 SDL_WINDOW_FULLSCREEN 时所做的一切。因此,您可以只传递一个 bool (true == 1, false == 0)
      • 我知道它有效,因为我正在编写一个通用的 SDL2 窗口并使用它。检查我的实现以供参考:github.com/LyingDutch/SDL2Window
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      相关资源
      最近更新 更多