【问题标题】:SDL2 Toggle fullscreen: Window position gets resetSDL2 切换全屏:窗口位置被重置
【发布时间】:2017-10-28 11:47:48
【问题描述】:

我正在尝试在 SDL2 中切换全屏,到目前为止它可以工作。但是,当模式返回窗口模式时,位置会重置为 0、0。我尝试在窗口全屏之前存储窗口的最后一个位置,但在返回窗口模式后,位置仍会重置为 0,0。

我正在输出最后一个位置,它看起来是正确的,但是当返回窗口时它仍然被重置为 0,0。我需要监听某个事件或其他什么吗?

void ToggleFullscreen(SDL_Window* window) {
    Uint32 flag = SDL_WINDOW_FULLSCREEN;
    bool isFullscreen = SDL_GetWindowFlags(window) & flag;
    if(!isFullscreen){
        SDL_GetWindowPosition(window, &lastWindowX, &lastWindowY);
    }

    SDL_SetWindowFullscreen(window, isFullscreen ? 0 : flag);

    if(isFullscreen){
        cout << "set window to: " << lastWindowX << " " << lastWindowY << endl;
        SDL_SetWindowPosition(window, lastWindowX, lastWindowY);
    }

}

【问题讨论】:

  • 我测试了你的代码,它应该可以工作。你确定你没有将lastWindowXlastWindowY 设置为0?
  • 它适用于某些机器,但不适用于其他机器。我不确定为什么。在将其从全屏设置为窗口后,我尝试过做一个异步计时器,然后在 2 秒后设置位置。它有时似乎有效,但有时边界变为无边界。在线某处必须有某种全屏切换代码,但我真的找不到。现在 SDL2 似乎不受支持。
  • 你试过用SDL_WINDOW_FULLSCREEN_DESKTOP代替SDL_WINDOW_FULLSCREEN吗?

标签: c++ windows sdl-2


【解决方案1】:

查看我的一个具有设置窗口、全屏或全屏桌面功能的项目,我发现以下两行:

// Fixes problem when Game::changeResolution is called in fullscreen or fullscreen desktop and then return to windowed.
SDL_SetWindowSize(m_pWindow, m_width, m_height);
SDL_SetWindowPosition(m_pWindow, SDL_WINDOWPOS_CENTERED, 
SDL_WINDOWPOS_CENTERED);

先完成SDL_SetWindowSize,一切正常。然后我注释掉了SDL_SetWindowSize 行并再次运行。从SDL_WINDOW_FULLSCREEN_DESKTOP 返回时,它会将其位置重置为(0,0)

虽然从SDL_WINDOW_FULLSCREEN回到windowed时,还是放好了。尝试添加该行,看看它是否为您解决了问题。还可以尝试在通话之间添加SDL_Delay(2000);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 2012-05-02
    • 2013-07-28
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多