使用SDL处理最大化的窗口

时间:2011-12-30 12:43:21

标签: sdl window-management

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

Bitfighter在固定宽高比窗口(800x600像素)下运行。用户可以将窗口设置为他们想要的任何大小,但我们捕获resize事件并调整所请求的大小以确保窗口保持正确的比例(使用SDL_SetVideoMode)。

(以下问题适用于Windows,但尚未在其他平台上进行过测试。我在下面介绍的内容专门针对Windows,但我正在寻找独立于平台的解决方案。)

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

我正在寻找一种独立于平台的方式来执行以下任何操作(按优先级降序排列):

  1. 在窗口最大化后调整窗口大小
  2. 检测窗口何时最大化,以便知道我无法调整窗口大小,我至少可以将视频调整为居中
  3. 防止窗口最大化(阻止双击窗口标题栏,使用最大化按钮,并将窗口拖动到屏幕顶部)
  4. Bitfighter是用C ++编写的,我们正在使用最新的SDL官方版本。

2 个答案:

答案 0 :(得分:1)

迁移到SDL 2.0(您似乎已经拥有)

SDL 2.0为窗口管理提供了更好的API(它实际上提供了一个)。虽然SDL 2.0中的Windows管理仍然存在许多漏洞(特别是在Linux方面),但自1.2天以来它已经有了很大的改进。

答案 1 :(得分:0)

我假设您使用OpenGL和SDL,因为之前使用过GLUT。我不知道该问题的任何解决方案,请点2。如果您希望视频具有特定大小,只需保留SDL-Window,然后调用

glViewport(0, 0, width, height);

具有正确尺寸和正确比例。 使用该解决方案,您的窗口中仍然会有黑色边框,但它只显示您想要的内容。 (使用前两个参数,您还可以在窗口中设置视口的位置;))