SDL2:调整窗口大小时如何保持宽高比

诈骗

我正在尝试创建一个SDL窗口,该窗口在调整大小事件发生时保持其长宽比。如果用户加宽窗口,则高度会增加,反之亦然。我捕获了SDL_WINDOWEVENT_RESIZED事件,计算了保持宽高比的新宽度或高度,然后使用计算出的值调用SDL_SetWindowSize()。

问题在于,在事件轮询循环内调用SDL_SetWindowSize()函数不会在屏幕上执行任何操作。SDL确实会更新窗口尺寸变量(在我的主循环中调用SDL_GetWindowSize()会返回更新的窗口尺寸)。但是,实际的窗口不会更新。

我可以使它起作用的唯一方法是在主循环中不断调用SDL_SetWindowSize(),但是我认为这是错误的处理方式。下面的代码说明了我的问题。有没有更好,更清洁的方法来使它起作用?

我正在将SDL 2.0.3和64位Ubuntu Linux与GNOME桌面一起使用。

#include <SDL2/SDL.h>

static const float ASPECT_RATIO = 16.f/9.f;

SDL_Window* window;
SDL_Renderer* renderer;

uint32_t windowID;
SDL_Rect screen;
bool done = false;
bool resizeDone = false;

void handle_events()
{
    SDL_Event e;
    while (SDL_PollEvent(&e)) {
        switch (e.type) {

        case SDL_WINDOWEVENT: 
            if(e.window.windowID == windowID) {
                switch(e.window.event) {
                    case SDL_WINDOWEVENT_RESIZED: { 
                        int width = e.window.data1;
                        int height = e.window.data2;
                        float aspectRatio = (float)width/(float)height;

                        if(aspectRatio != ASPECT_RATIO) {
                            if(aspectRatio > ASPECT_RATIO) {
                                height = (1.f / ASPECT_RATIO) * width; 
                            }
                            else {
                                width = ASPECT_RATIO * height; 
                            }

                            printf("Setting window size to %d, %d, aspect ratio: %f\n", 
                                width, height, (float)width/(float)height);
                    }
                    screen.w = width;
                    screen.h = height; 

                    SDL_SetWindowSize(window, width, height); // <-- does not work
                    resizeDone = true;
                    break;
                    }
                }
             }
             break;

        case SDL_QUIT:
            done = true;
            break;

        default:
            break;
        }
    }   
}

void run() {
    while(!done) {
        //SDL_SetWindowSize(window, screen.w, screen.h); // <-- works
        handle_events();
        SDL_RenderClear(renderer);
        SDL_RenderPresent(renderer);

        if(resizeDone) {
            int w, h;
            SDL_GetWindowSize(window, &w, &h);
            printf("SDL_GetWindowSize: %d, %d\n", w, h);
            resizeDone = false;
        }
    }
}

int main(int, char**) {
    SDL_Init(SDL_INIT_VIDEO);
    uint32_t window_flags = SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_RESIZABLE;
    window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags);
    windowID = SDL_GetWindowID(window);
    renderer = SDL_CreateRenderer(window, -1, 0);
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
    run();
    SDL_Quit();
    return 0;
}
海藻

一些窗口管理器似乎忽略了WM自身调整窗口大小时发出的调整大小请求(例如,按住鼠标按钮时)。相反,SDL_GetWindowSize返回缓存的值,在这种情况下,有时会碰巧是错误的。

我以为SDL_SetWindowSize以防万一,除了不断地调用每个帧外,我看不到任何与平台无关的方法来实现这一目标不过,可以使用特定于平台的API来实现(例如SDL_GetWindowSysWMInfo,然后使用Xlib)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何按比例调整图像大小/保持宽高比?

SDL2窗口大小大于应有的大小

SDL2窗口在调整大小时变黑

在Highcharts饼图中,如何在调整窗口大小时保持高度同步?

调整窗口大小时如何锁定宽高比?

调整窗口大小时如何使表响应?

调整窗口大小时如何触发功能?

如何在调整/缩小Tkinter应用程序窗口的大小时保持小部件可见

调整窗口大小时如何使用滚动

如何在调整窗口大小时保持chartjs / ng2-charts渐变?

调整窗口大小时如何在边框上添加元素并保持其位置?

调整父窗口小部件的大小时,通过保持宽高比来调整子窗口小部件的大小

调整窗口大小时如何使图像流畅?

调整SDL2窗口的大小?

调整窗口大小时如何保持元素居中

使用SDL2调整无边界窗口大小时的错误

SDL2调整窗口+鼠标位置的大小

调整窗口大小时如何调整ListView控件的大小

调整大小时保持.ui-dialog-content的宽高比

如何调整图像大小并保持宽高比?

调整窗口大小时丢失宽高比

在Flex中调整表格大小,同时保持宽高比,如何?

调整窗口大小时如何保持对象大小相同

调整窗口大小时如何自动调整 JFreeChart 的大小

调整窗口大小时如何保持div居中?

调整窗口大小时如何堆叠列

当窗口调整大小时保持纵横比

css - 如何在调整窗口大小时连续制作 flex 项目 3 并保持 1:1 的比例

调整窗口大小时,如何使链接保持相对于背景图像的位置?