2012-07-04 5 views
8

Ich habe mit der freglut-Bibliothek eine Weile mit OpenGL experimentiert und beschlossen, GLFW für mein nächstes Trainingsprojekt zu verwenden, da mir gesagt wurde, dass GLUT nur für Lernzwecke gedacht ist und nicht professionell genutzt werden sollte. Ich hatte keine Probleme mit der Verknüpfung der Lib zu meinem NetBeans-Projekt und es kompiliert gut, mit mingw32 4.6.2.GLFW Bildschirmhöhe/-breite erhalten?

Allerdings habe ich Schwierigkeiten, das Fenster in der Mitte des Bildschirms zu positionieren. Unter freeglut, habe ich bisher:

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

ich jede GLFW Funktion nicht finden können, die die Bildschirmgröße oder Breite zurückkehren würde. Wird eine solche Funktion einfach nicht implementiert?

Antwort

8

Wie wäre es mit glfwGetDesktopMode, ich denke, das ist, was Sie wollen.

Beispiel:

GLFWvidmode return_struct; 

glfwGetDesktopMode(&return_struct); 

int height = return_struct.Height; 
+0

Ich bin ein bisschen verwirrt, in glfw.h heißt es: 'typedef struct { int Breite, Höhe; int RedBits, BlueBits, GreenBits; } GLFWvidmode; 'Was soll ich als Argument verwenden, wenn ich zum Beispiel die Höhe erreichen will? – CaffeineAddict

+0

@CyberpunC: Sie fragen nicht nach der Breite und Höhe getrennt. Sie erhalten * beide * in einem Anruf. Sie übergeben eine leere Struktur und füllen sie mit all diesen Feldern aus. Sie lesen die Felder, die Ihnen wichtig sind, und ignorieren den Rest. –

+0

Muss ich den Heap verwenden? Ist das nicht alles ein bisschen teuer? Warum sogar die Struktur? Gibt es eine Möglichkeit, dies als anonymes Objekt zu übergeben? BEARBEITEN: 'std :: cout << return_struct-> Höhe <<" "<< return_struct-> Breite << std :: endl;' druckt einfach "0 0" – CaffeineAddict

4

müssen Sie zunächst zwei Variablen Ihre Breite und Höhe zu speichern.

int width, height; 

dann als 14 der reference. auf Seite

glfwSetWindowPos(width/2, height/2); 

und als Bonus können Sie dann

glfwGetWindowSize(&width, &height); 

nennen dies eine Lücke Funktion und liefert keinen Wert, den es jedoch wird die beiden zuvor deklarierten Variablen aktualisieren .. also plazieren Sie sie in der Hauptschleife oder in der Fensterumformungs-Callback-Funktion.

können Sie dies im offiziellen Handbuch überprüfen here auf Seite 15.

+0

Dies würde das Fenster nicht zentrieren, stattdessen 'glfwSetWindowPos (ScreenWidth/2 - WindowWidth/2, ...);'. – danijar

+0

@sharethis Ich habe nicht gesagt, es würde .. Lesen Sie seine Frage erneut .. Er fragte als Teil seiner Frage nach der Funktion, die die Fenstergröße zurückgeben würde. – iKlsR

2

Dieses jemand helfen könnte ...

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 und m_Height Variablen, die die Breite und die Höhe des Fensters haben .

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

+0

Diese Lösung ist richtig, aber wenn das Fenster nicht geöffnet ist Primärmonitor diese Lösung wird nicht funktionieren. – 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.