2011-12-30 108 views
5

我们最近将Bitfighter从GLUT移植到SDL。这样做有很多好处,但也有一些缺点,特别是在窗口管理领域。使用SDL处理最大化窗口

Bitfighter运行在固定纵横比窗口(800x600像素)。用户可以根据自己的需要设置任意大小的窗口,但我们捕获大小调整事件并根据请求的大小进行调整,以确保窗口保持正确的比例(使用SDL_SetVideoMode)。

(以下问题适用于Windows,但尚未在其他平台上进行测试。我在下面说明具体指的是Windows,虽然我在寻找一个独立于平台的解决方案。)

通常,这非常好,除非用户通过双击标题栏或使用最大化按钮来最大化窗口。在这种情况下,调用窗口大小事件的窗口大小近似于屏幕大小(窗口装饰减去一些像素)。不幸的是,当窗口被最大化时,SDL_SetVideoMode没有效果(不像GLUT能调整最大化的窗口)。此外,随后对SDL_GetVideoInfo的调用会报告我们请求的大小,而不是实际当前的窗口大小,因此很难判断尝试调整大小是否奏效。

我找了一个独立于平台的方式做任何以下的(按优先顺序排列):它被最大化

  • 检测后,当一个窗口已被最大化,所以

    1. 调整窗口大小知道我无法调整它的大小,我至少可以调整视频中心
    2. 防止最大化窗口(阻止双击窗口标题栏,使用最大化按钮,并拖动窗口到屏幕上方)

    Bitfighter是用C++编写的,我们正在使用SDL的最新官方版本。

  • +0

    您是否有能力尝试SDL 1.3 HEAD? – genpfault 2012-01-03 15:39:06

    +0

    我们可能会;取决于它的稳定性。我们希望在几周内发布。 – Watusimoto 2012-01-05 10:27:42

    +1

    查看您的代码,看起来您已经迁移到SDL 2.0。这是否解决了你的问题? – faffy 2012-08-23 18:57:01

    回答

    0

    我假设你使用OpenGL和SDL,因为你之前使用过GLUT。我不知道该问题的任何解决方案,exept点2.如果要视频有一个特定的大小,只留下了SDL-窗口就像是,和打电话

    glViewport(0, 0, width, height); 
    

    与合适的尺寸与正确的比例。 使用该解决方案,您的窗口中仍然有一个黑色边框,但它只显示尽可能多的,如您所愿。 (与第2个参数,你还可以设置视口窗口的位置;))

    1

    迁移到SDL 2.0(这好像你已经有了)

    SDL 2.0提供了一个更好的API来管理窗口(它实际上提供了一个)。虽然SDL 2.0中的Windows管理仍然存在很多错误(尤其是在Linux方面),但自1.2天以来它已经大大改善。