如何使全屏窗口居中

How to center fullscreen window

本文关键字:窗口 何使全      更新时间:2023-10-16

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

我想把窗户居中,左右两边都有黑条。

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

有两种情况:(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),我想你应该自己计算表面的坐标并画出大的黑条。更困难的是,我无法证明简单的解决方案。