Обработка развернутых окон с использованием SDL - PullRequest
4 голосов
/ 30 декабря 2011

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 02 января 2013

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

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

0 голосов
/ 16 февраля 2012

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

glViewport(0, 0, width, height);

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

...