如何使全屏窗口居中

时间:2015-03-18 14:51:44

标签: c++ fullscreen centering sdl-2 aspect-ratio

我有一个16:9的显示屏,我想显示处于4:3模式的全屏SDL窗口。SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN)将窗口设置在屏幕左侧并留下一个大黑酒吧在右边。

我想让窗户居中,左侧和右侧都有黑条。

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

1 个答案:

答案 0 :(得分:1)

有两种情况: (1)根据窗口大小显示渲染器和纹理。 (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);
}

请注意,只要窗口改变大小,就应该调用此函数。

对于(2)我猜你应该计算表面的坐标并自己绘制大黑条。我无法证明简单的解决方案更加困难。