2012-07-04 24 views
8

Chơi xung quanh với OpenGL trong một thời gian, sử dụng thư viện freeglut, tôi quyết định sử dụng GLFW cho dự án đào tạo tiếp theo của mình, vì tôi đã nói rằng GLUT chỉ được thiết kế cho mục đích học tập và không nên sử dụng chuyên nghiệp. Tôi không gặp vấn đề gì với việc liên kết lib với dự án NetBeans của tôi và nó biên dịch tốt, bằng cách sử dụng mingw32 4.6.2.GLFW có chiều cao/chiều rộng màn hình không?

Tuy nhiên, tôi đang gặp khó khăn khi cố định vị trí cửa sổ ở giữa màn hình. Dưới freeglut, tôi đã sử dụng trước đây:

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

Tôi không thể tìm thấy bất kỳ chức năng glfw nào có thể trả về kích thước màn hình hoặc chiều rộng. Là một chức năng như vậy chỉ đơn giản là không được thực hiện?

Trả lời

8

Làm thế nào về glfwGetDesktopMode, tôi nghĩ rằng đây là những gì bạn muốn.

Ví dụ:

GLFWvidmode return_struct; 

glfwGetDesktopMode(&return_struct); 

int height = return_struct.Height; 
+0

tôi loại bối rối, trong glfw.h nó nói: 'typedef struct {int Width, Height; int RedBits, BlueBits, GreenBits; } GLFWvidmode; 'Ví dụ tôi nên sử dụng làm đối số nếu tôi muốn có chiều cao? – CaffeineAddict

+0

@CyberpunC: Bạn không yêu cầu chiều rộng và chiều cao riêng biệt. Bạn nhận được * cả hai * trong một cuộc gọi. Bạn vượt qua một cấu trúc rỗng, và nó điền vào nó với tất cả các trường đó. Bạn đọc các lĩnh vực bạn quan tâm, và bỏ qua phần còn lại. –

+0

Tôi có phải sử dụng heap không? Điều này không đắt chút nào sao? Tại sao ngay cả cấu trúc? Có cách nào để vượt qua điều này như là một đối tượng vô danh? EDIT: 'std :: cout << return_struct-> Chiều cao <<" "<< return_struct-> Chiều rộng << std :: endl;' chỉ in "0 0" – CaffeineAddict

4

đầu tiên bạn cần hai biến để lưu trữ chiều rộng và chiều cao của bạn.

int width, height; 

sau đó như mô tả trên trang 14 của reference.

glfwSetWindowPos(width/2, height/2); 

và như một phần thưởng sau đó bạn có thể gọi

glfwGetWindowSize(&width, &height); 

này một chức năng vô hiệu và không trả lại bất kỳ giá trị tuy nhiên nó sẽ cập nhật hai biến được khai báo trước đó .. vì vậy hãy đặt nó trong mainloop hoặc chức năng gọi lại định dạng lại cửa sổ.

bạn có thể xác minh điều này trong cuốn hướng dẫn chính thức here trên trang 15.

+0

Điều này sẽ không làm trung tâm cửa sổ, sử dụng 'glfwSetWindowPos (ScreenWidth/2 - WindowWidth/2, ...);' thay thế. – danijar

+0

@sharethis tôi đã không nói nó sẽ .. đọc câu hỏi của mình một lần nữa .. ông hỏi như là một phần của câu hỏi của mình cho các chức năng mà sẽ trở lại kích thước cửa sổ .. – iKlsR

2

Điều này có thể giúp ai đó ...

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_Widthm_Height là các biến có chiều rộng và chiều cao của cửa sổ .

tham khảo: http://www.glfw.org/docs/latest/monitor.html

+0

Giải pháp này là chính xác, nhưng khi cửa sổ không được mở trong giám sát chính giải pháp này sẽ không hoạt động. – 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.