2012-07-04 38 views
8

Mientras jugaba con OpenGL por un tiempo, usando la biblioteca freeglut, decidí que usaría GLFW para mi próximo proyecto de capacitación, ya que me dijeron que GLUT solo se diseñó con fines de aprendizaje y no se debe usar profesionalmente. No tuve problemas para vincular lib a mi proyecto NetBeans y se compila muy bien, usando mingw32 4.6.2.GLFW ¿obtener altura/ancho de pantalla?

Sin embargo, tengo dificultades para intentar colocar la ventana en el centro de la pantalla. Bajo freeglut, que previamente utilizados:

glutInitWindowPosition ( 
         (glutGet(GLUT_SCREEN_WIDTH)-RES_X)/2, 
         (glutGet(GLUT_SCREEN_HEIGHT)-RES_Y)/2 
         ); 

no puedo encontrar ninguna función GLFW que devolvería el tamaño de la pantalla o anchura. ¿Tal función simplemente no está implementada?

Respuesta

8

¿Qué tal glfwGetDesktopMode, creo que esto es lo que quieres.

Ejemplo:

GLFWvidmode return_struct; 

glfwGetDesktopMode(&return_struct); 

int height = return_struct.Height; 
+0

estoy algo confundido, en glfw.h que dice: 'typedef struct {int Ancho, Alto; int RedBits, BlueBits, GreenBits; } GLFWvidmode; '¿Qué se supone que debo usar como argumento si quiero obtener la altura, por ejemplo? – CaffeineAddict

+0

@CyberpunC: No pide el ancho y la altura por separado. Obtiene * ambos * en una llamada. Pasa una estructura vacía y la rellena con todos esos campos. Lees los campos que te interesan e ignoras el resto. –

+0

¿Debo usar el montón? ¿No es esto un poco caro? ¿Por qué incluso la estructura? ¿Hay alguna manera de pasar esto como un objeto anónimo? EDITAR: 'std :: cout << return_struct-> Height <<" "<< return_struct-> Width << std :: endl;' solo imprime "0 0" – CaffeineAddict

4

primero que hay dos variables para almacenar su anchura y altura.

int width, height; 

entonces como se describe en la página 14 de la reference.

glfwSetWindowPos(width/2, height/2); 

y como un bono a continuación, puede llamar

glfwGetWindowSize(&width, &height); 

esta función nula y no devuelve ningún valor sin embargo, actualizará las dos variables previamente declaradas ... así que colóquelo en la función de retrollamada mainloop o remodelar la ventana.

puede verificar esto en el manual oficial here en la página 15.

+0

Esto no centraría la ventana, use 'glfwSetWindowPos (ScreenWidth/2 - WindowWidth/2, ...);' en su lugar. – danijar

+0

@sharethis No dije que ... leería su pregunta nuevamente ... preguntó como parte de su pregunta por la función que devolvería el tamaño de la ventana ... – iKlsR

2

Esto podría ayudar a alguien ...

void Window::CenterTheWindow(){ 
      GLFWmonitor* monitor = glfwGetPrimaryMonitor(); 
      const GLFWvidmode* mode = glfwGetVideoMode(monitor); 
      glfwSetWindowPos(m_Window, (mode->width - m_Width)/2, (mode->height - m_Height)/2); 
} 

m_Width y m_Height son variables que tienen la anchura y la altura de la ventana .

Referencia: http://www.glfw.org/docs/latest/monitor.html

+0

Esta solución es correcta, pero cuando la ventana no se abre en el monitor principal esta solución no va a funcionar. – MahanGM

0
// Settings 
int SCR_WIDTH = 800; 
int SCR_HEIGHT = 600; 
char TITLE[] = "Stack Overflow"; 
/*..Initilized..*/ 
const GLFWvidmode* mode = glfwGetVideoMode(glfwGetPrimaryMonitor()); 
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH,SCR_HEIGHT,TITLE,nullptr,nullptr); 
// Because (x,y) starts from the top left corner, We got to subtract our window size. 
glfwSetWindowPos(window,(mode->width-SCR_WIDTH)/2,(mode->height-SCR_HEIGHT)/2); 
//divided by two to center. 
Cuestiones relacionadas