如何调整SDL2窗口大小?

14

刚从SDL1.2跃升到SDL2,一直在转换我的代码,但是无法弄清如何调整窗口大小。这是我现在拥有的代码:

SDL_DestroyWindow(Window);
Window = SDL_CreateWindow("Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, ScreenSizeX, ScreenSizeY, SDL_WINDOW_SHOWN);
screen = SDL_GetWindowSurface(Window);

正如您所看到的,它只是破坏了窗口并创建了一个新的窗口。这很粗糙但能够运行。我想要的是只调整窗口大小,这可能吗?

4个回答

30

我相信你可以使用SDL_CreateWindow中的SDL_WINDOW_RESIZABLE标志使窗口可调整大小。


17

14
要调整SDL中的窗口大小,首先使用标志SDL_WINDOW_RESIZABLE设置窗口,然后在switch中检测窗口调整事件,最后调用glViewport(0, 0, windowWidth, windowHeight)
switch中,如果只想获取窗口的最终大小,请使用标志SDL_WINDOWEVENT_RESIZED,如果想获取从开始到最终的所有大小,请使用SDL_WINDOWEVENT_SIZE_CHANGED
最后,使用新的窗口宽度和高度更新您自己的相机。
m_window = SDL_CreateWindow("INCEPTION",
    SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
    m_windowWidth, m_windowHeight,
    SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);


switch (m_event.type) {

    case SDL_WINDOWEVENT:

        if (m_event.window.event == SDL_WINDOWEVENT_RESIZED) {
            logFileStderr("MESSAGE:Resizing window...\n");
            resizeWindow(m_event.window.data1, m_event.window.data2);
        }
        break;

    default:
        break;
}


void InceptionServices::resizeWindow(int windowWidth, int windowHeight) {
    logFileStderr("MESSAGE: Window width, height ... %d, %d\n", windowWidth, windowHeight);
    m_camera->resizeWindow(windowWidth, windowHeight);
    glViewport(0, 0, windowWidth, windowHeight);
}

为什么要用当前窗口大小调用SDL_SetWindowSize函数? - HolyBlackCat
void InceptionServices::resizeWindow(int windowWidth, int windowHeight) 中调用 SDL_SetWindowSize,大小由 SDL 在 switch 中给出的调整后窗口的 m_event.window.data1m_event.window.data2 给出。 - LastBlow
3
是的,但窗口会自动调整大小。您不需要调用“SDL_SetWindowSize”来调整大小。 - HolyBlackCat
对于完整性而言,我认为这是有道理的,但我同意SDL会自动调整窗口大小,所以我只需删除SDL_SetWindowSize(m_window, windowWidth, windowHeight);这行代码。 - LastBlow

2
Window = SDL_CreateWindow(
  "Test",
  SDL_WINDOWPOS_UNDEFINED,
  SDL_WINDOWPOS_UNDEFINED,
  ScreenSizeX,
  ScreenSizeY,
  SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE
);

使用此函数调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接