问题描述
背景:使用一个已有的窗口句柄,传入SDL2进行渲染视频。
问题:当缩放窗口大小时,渲染区域不会改变,一直都是初始大小,没有跟随实际的窗口大小。
SDL渲染流程
获取窗口实际大小
由流程可以看出,问题的关键在于如何获取窗口的实际大小。
windows系统
在Windows下可通过Windows的API获取
RECT rect;
GetWindowRect((HWND)hWnd, &rect);
*nWidth = rect.right - rect.left;
*nHeight = rect.bottom - rect.top;
linux操作系统
linux下我试过SDL_GetWindowSize
, SDL_GetWindowBordersSize
, 获取到的都不是实际窗口的大小。
并且SDL2并没有一个接口给我调用可以获得窗口实际大小。
不过没关系,没有枪没有炮我们自己造。
首先,我们只传给了SDL2一个窗口句柄,SDL2能正确的渲染出来,说明SDL2在创建窗口的时候一定获取到了窗口的实际大小。 好嘞,我们看SDL2的源码。
进入SDL_video.c 种的CreateWindowFrom
.
没有什么有用的信息,SDL_CreateWindowFrom
只是一个接口函数,我们还得进入红框框住的真正函数里面。
由于我们知道linux 一般都是X11做的界面。我们直接找到SDL_x11windows.c 的 X11_CreateSDLWindowFrom
就好了。
最终我们找到了X11获取实际窗口大小的代码是
将这个代码替换X11_SDL_GetWindowSize
这样当我们调用X11_SDL_GetWindowSize的时候,获取的就是实际的窗口大小了。