Обработка развернутых окон с использованием SDL

Недавно мы портировали Bitfighter с GLUT на SDL. В этом было много преимуществ, но есть и некоторые недостатки, особенно в области управления окнами.

Bitfighter работает в окне с фиксированным соотношением сторон (800x600 пикселей). Пользователи могут сделать свое окно любого размера, который они хотят, но мы фиксируем событие изменения размера и вносим коррективы в требуемый размер, чтобы гарантировать, что окно сохраняет правильные пропорции (используя SDL_SetVideoMode).

(Следующая проблема относится к Windows, но еще не была протестирована на других платформах. То, что я опишу ниже, относится конкретно к Windows, хотя я ищу решение, не зависящее от платформы.)

Обычно это прекрасно работает, за исключением случаев, когда пользователи максимизируют свое окно, дважды щелкнув по строке заголовка или используя кнопку максимизации. В этом случае событие изменения размера окна вызывается с размером окна, приблизительно равным размеру экрана (за вычетом некоторых пикселей для оформления окна). К сожалению, когда окно развернуто, SDL_SetVideoMode не имеет никакого эффекта (в отличие от GLUT, который смог изменить размер развернутого окна). Кроме того, последующие вызовы SDL_GetVideoInfo сообщают о запрашиваемом размере, а не о текущем текущем размере окна, поэтому трудно сказать, сработала ли попытка изменения размера.

Я ищу независимый от платформы способ выполнить любое из следующих действий (в порядке убывания предпочтений):

  1. Изменить размер окна после того, как оно было развернуто
  2. Определите, когда окно было развернуто, так что, зная, что не могу изменить его размер, я могу, по крайней мере, настроить видео по центру
  3. Предотвращение максимизации окна (блокировка двойного щелчка по строке заголовка окна, использование кнопки максимизации и перетаскивание окна в верхнюю часть экрана)

Bitfighter написан на C++, и мы используем последний официальный выпуск SDL.

2 ответа

Миграция на SDL 2.0 (который, кажется, уже есть)

SDL 2.0 предоставляет лучший API для управления окнами (фактически он предоставляет один). Хотя в управлении SDL 2.0 все еще есть много ошибок в управлении Windows (особенно на стороне Linux), оно значительно улучшилось за 1,2 дня.

Я предполагаю, что вы используете OpenGL с SDL, потому что вы использовали GLUT раньше. Я не знаю никаких решений для этой проблемы, кроме пункта 2. Если вы хотите, чтобы Видео имело определенный размер, просто оставьте SDL-окно таким, как оно есть, и вызовите

glViewport(0, 0, width, height);

с правильным размером с правильными пропорциями. С этими решениями у вас все еще будет черная рамка в вашем окне, но она показывает только столько, сколько вы хотите. (с помощью первых двух аргументов вы также можете установить положение окна просмотра в окне;))

Другие вопросы по тегам