如何居中全屏 window

How to center fullscreen window

我有一个 16:9 显示器,我想在其中显示处于 4:3 模式的全屏 SDL window。SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN) 设置 window到屏幕的左侧,并在右侧留下一个大黑条。

我想将 window 居中并在左侧和右侧设置黑条。

在全屏模式下,SDL_SetWindowPosition(window, x, y)似乎对window没有影响。我可以在 SDL2 中将全屏居中 window 吗?

有两种情况: (1) 根据 window 尺寸显示渲染器和纹理。 (2) 基于像素的屏幕和表面显示。

对于 (1),这是一个基于为渲染器设置视口的简单解决方案。(没有测试,只是一个指南)

void SDL_SetRendererViewportRatio_4_3(SDL_Window *window,
                                      SDL_Renderer *renderer
                                      SDL_Rect *viewport) {
    Uint8 r, g, b, a;
    SDL_GetRenderDrawColor(renderer, &r, &g, &b, &a);
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
    SDL_SetRenderDrawColor(renderer, r, g, b, a);
    int w, h;
    SDL_GetWindowSize(window, &w, &h);
    if (w * 3 > h * 4) {
        viewport->w = h * 4 / 3;
        viewport->h = h;
    } else {
        viewport->w = w;
        viewport->h = w * 3 / 4;
    }
    viewport->x = (w - viewport->w) / 2;
    viewport->y = (h - viewport->h) / 2;
    SDL_RenderSetViewport(renderer, viewport);
}

请注意,只要 window 更改大小,您就应该调用此函数。

对于(2)我猜你应该自己计算surface的坐标然后画大黑条。我无法证明简单的解决方案更加困难。