Обработка развернутых окон с использованием SDL
Недавно мы портировали Bitfighter с GLUT на SDL. В этом было много преимуществ, но есть и некоторые недостатки, особенно в области управления окнами.
Bitfighter работает в окне с фиксированным соотношением сторон (800x600 пикселей). Пользователи могут сделать свое окно любого размера, который они хотят, но мы фиксируем событие изменения размера и вносим коррективы в требуемый размер, чтобы гарантировать, что окно сохраняет правильные пропорции (используя SDL_SetVideoMode).
(Следующая проблема относится к Windows, но еще не была протестирована на других платформах. То, что я опишу ниже, относится конкретно к Windows, хотя я ищу решение, не зависящее от платформы.)
Обычно это прекрасно работает, за исключением случаев, когда пользователи максимизируют свое окно, дважды щелкнув по строке заголовка или используя кнопку максимизации. В этом случае событие изменения размера окна вызывается с размером окна, приблизительно равным размеру экрана (за вычетом некоторых пикселей для оформления окна). К сожалению, когда окно развернуто, SDL_SetVideoMode не имеет никакого эффекта (в отличие от GLUT, который смог изменить размер развернутого окна). Кроме того, последующие вызовы SDL_GetVideoInfo сообщают о запрашиваемом размере, а не о текущем текущем размере окна, поэтому трудно сказать, сработала ли попытка изменения размера.
Я ищу независимый от платформы способ выполнить любое из следующих действий (в порядке убывания предпочтений):
- Изменить размер окна после того, как оно было развернуто
- Определите, когда окно было развернуто, так что, зная, что не могу изменить его размер, я могу, по крайней мере, настроить видео по центру
- Предотвращение максимизации окна (блокировка двойного щелчка по строке заголовка окна, использование кнопки максимизации и перетаскивание окна в верхнюю часть экрана)
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);
с правильным размером с правильными пропорциями. С этими решениями у вас все еще будет черная рамка в вашем окне, но она показывает только столько, сколько вы хотите. (с помощью первых двух аргументов вы также можете установить положение окна просмотра в окне;))