如何居中全屏 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的坐标然后画大黑条。我无法证明简单的解决方案更加困难。
我有一个 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的坐标然后画大黑条。我无法证明简单的解决方案更加困难。