4

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

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

(以下问题适用于Windows,但尚未在其他平台上进行测试。我下面描述的内容专门针对Windows,尽管我正在寻找与平台无关的解决方案。)

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

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

  1. 最大化后调整窗口大小
  2. 检测窗口何时最大化,以便知道我无法调整它的大小,我至少可以将视频调整为居中
  3. 防止窗口最大化(阻止双击窗口标题栏、使用最大化按钮以及将窗口拖到屏幕顶部)

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

4

2 回答 2

1

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

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

于 2013-01-02T19:16:55.047 回答
0

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

glViewport(0, 0, width, height);

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

于 2012-02-15T21:03:33.130 回答