2011-12-30 7 views
5

Hace poco hemos portado Bitfighter de GLUT a SDL. Hubo numerosos beneficios al hacer esto, pero también algunos inconvenientes, especialmente en el área de administración de ventanas.Manejo de ventanas maximizadas usando SDL

Bitfighter se ejecuta en una ventana de relación de aspecto fija (800x600 píxeles). Los usuarios pueden hacer que su ventana sea del tamaño que quieran, pero capturamos el evento de cambio de tamaño y hacemos ajustes en el tamaño solicitado para asegurar que la ventana mantenga las proporciones correctas (usando SDL_SetVideoMode).

(El siguiente problema se aplica a Windows, pero aún no ha sido probado en otras plataformas. Lo que describo a continuación se refiere específicamente a Windows, aunque yo estoy buscando una solución independiente de la plataforma.)

Normalmente, este Funciona muy bien, excepto cuando los usuarios maximizan su ventana haciendo doble clic en la barra de título o usando el botón Maximizar. En ese caso, se llama al evento de cambio de tamaño de la ventana con un tamaño de ventana que se aproxima al tamaño de la pantalla (menos algunos píxeles para la ornamentación de la ventana). Desafortunadamente, cuando la ventana está maximizada, SDL_SetVideoMode no tiene ningún efecto (a diferencia de GLUT que fue capaz de cambiar el tamaño de una ventana maximizada). Además, las llamadas posteriores a SDL_GetVideoInfo informan el tamaño que solicitamos, no el tamaño actual real de la ventana, por lo que es difícil determinar si el intento de cambio de tamaño funcionó.

Busco una manera independiente de la plataforma para realizar cualquiera de las siguientes (en orden descendente de preferencia):

  1. tamaño de una ventana después de que ha sido maximizada
  2. detectar cuando una ventana se ha maximizado por lo que, sabiendo que no puedo redimensionarlo, al menos puedo ajustar el video para centrarlo
  3. Evitar que una ventana se maximice (bloquear doble clic en la barra de título de la ventana, usar el botón Maximizar y arrastrar la ventana al parte superior de la pantalla)

Bitfighter está escrito en C++, y estamos utilizando la última versión oficial de SDL.

+0

¿Estás en condiciones de probar SDL 1.3 HEAD? – genpfault

+0

Podría ser; dependiendo de cuán estable sea. Esperamos lanzar en un par de semanas. – Watusimoto

+1

Mirando a través de su código, parece que ha migrado a SDL 2.0. ¿Esto solucionó tus problemas? – faffy

Respuesta

0

Supongo que utiliza OpenGL con SDL, porque antes usaba GLUT. No sé ninguna solución para ese problema, exepto el punto 2. Si desea que el vídeo tiene un tamaño específico, simplemente dejo el SDL-ventana como es, y llamo

glViewport(0, 0, width, height); 

con el tamaño adecuado con las proporciones correctas. Con esas soluciones, todavía tendrá un borde negro en su ventana, pero solo muestra tanto como desee. (Con los 2 primeros argumentos también se puede ajustar la posición de la ventana gráfica en la ventana;))

1

Migrar a SDL 2.0 (que parece que ya tiene)

SDL 2.0 proporciona una mejor API para la gestión de ventanas (en realidad proporciona uno). Si bien todavía hay muchos errores en la administración de Windows en SDL 2.0 (especialmente en el lado de Linux), ha mejorado enormemente desde los 1.2 días.