【问题标题】:SDL adjust window sizeSDL 调整窗口大小
【发布时间】:2016-12-15 14:18:15
【问题描述】:

我希望 SDL 窗口大小保持在窗口的working area (SPI_GETWORKAREA) 范围内,不包括 Windows 任务栏其他面板。

问题是SDL_CreateWindowSDL_SetWindowSize都设置了窗口的客户区,而不是包括窗口边框的大小。因此,当我将窗口大小设置为适合较小的工作区域时,边框仍然超出工作区域。

SDL_CreateWindow:使用此函数设置窗口客户区的大小。

SDL 是否提供了在工作区域内设置窗口大小的方法?或者我如何获得 SDL 窗口的边框大小以便我自己做?

【问题讨论】:

    标签: c++ windows sdl sdl-2


    【解决方案1】:

    我知道(SDL 1.2)的唯一方法是首先创建一个小窗口(2x2 像素),然后使用 Windows API (GetWindowPlacement) 检查总窗口大小。在此基础上,您可以计算得到您要查找的窗口大小所需的参数,并最终调整窗口大小(MoveWindow)。

    我希望有人有更好的解决方案,因为这是一个非常丑陋的解决方法。

    【讨论】:

    • 我认为您不需要创建 2x2 大小的窗口。如果您仍然使用 Windows API,您可以使用 GetWindowPlacement 获取窗口坐标,然后使用 ClientToScreen 获取屏幕上的客户区坐标。对这两个进行数学运算将给出边框大小。
    • 如果您找到一种解决方案,可以直接创建正确大小的窗口,而不先显示任何临时窗口,请发布您的代码。
    • 要使用 WinAPI,我们首先需要有窗口。我找不到单独使用 SDL 的方法。
    【解决方案2】:

    您甚至不需要 WinAPI 来执行此操作。

    窗口边框的大小可以由SDL_GetWindowBordersSize()来决定,显示中未被任务栏占用的部分应该由SDL_GetDisplayUsableBounds()返回。

    使用这些功能,保持适当的窗口位置(可能还有大小)应该很容易。

    【讨论】:

    • 但是SDL_GetWindowBordersSize()只适用于X11,不适用于Windows,所以你的第一句话就大错特错了。
    • @MichelRouzic wiki 是这么说的,是的,但是您尝试过使用它吗?它适用于我在 Windows 上。
    • 这就是我相信 wiki 所得到的。它确实有效,但是它给了我 31,8,8,8 这似乎在每一侧都太多了(似乎是调整大小控件的大小,而不是实际的视觉大小)。
    • @MichelRouzic 我没有要检查的 Win 10 机器,但在 Win 7 上,调整大小控件的大小与视觉边框相同,并且该函数正确输出 27 8 8 8。它在 Win 10 上给出了错误的答案,可能需要报告错误。
    • 好建议。我查看了WIN_GetWindowBordersSize() 的代码,它使用了GetWindowRect(),MSDN 声称它包括窗口阴影区域。当用DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &rcWindow, sizeof(rcWindow)); 替换该行时,当窗口最大化时我得到 23 0 0 0 ,当它不是时得到 31 1 1 1 ,这在视觉上似乎是正确的。我填写了一个错误报告:bugzilla.libsdl.org/show_bug.cgi?id=5302
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多