2012-07-04 253 views
8

使用Freeglut庫玩了OpenGL一段時間後,我決定將GLFW用於我的下一個培訓項目,因爲我被告知GLUT僅用於學習目的,不應該專業使用。將lib連接到我的NetBeans項目並沒有問題,使用mingw32 4.6.2編譯得很好。GLFW獲取屏幕高度/寬度?

但是,我試圖將窗口放在屏幕中心時遇到了困難。 在freeglut,我以前用過:

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

我找不到任何GLFW函數將返回屏幕尺寸或寬度。這樣的功能是不是實現了?

回答

8

glfwGetDesktopMode怎麼樣,我想這就是你想要的。

例子:

GLFWvidmode return_struct; 

glfwGetDesktopMode(&return_struct); 

int height = return_struct.Height; 
+0

我也有點困惑,在glfw.h它說:'typedef結構{ INT寬度,高度; int RedBits,BlueBits,GreenBits; } GLFWvidmode;'如果我想獲得高度,我應該用什麼作爲參數? – CaffeineAddict

+0

@Cyber​​punC:你不要單獨要求寬度和高度。你在一次通話中得到*兩個*。您傳遞一個空的結構體,並將其填充到所有這些字段中。你閱讀你關心的領域,並忽略其餘部分。 –

+0

我必須使用堆嗎?這不是很貴嗎?爲什麼即使結構?有沒有辦法將它作爲匿名對象傳遞?編輯:'std :: cout << return_struct-> Height <<「<< << return_struct-> Width << std :: endl;'只是打印」0 0「 – CaffeineAddict

4

首先你需要兩個變量來存儲您的寬度和高度。

int width, height; 

然後根據第14頁描述的reference.

glfwSetWindowPos(width/2, height/2); 

,並作爲獎勵,你可以調用

glfwGetWindowSize(&width, &height); 

void函數,不返回任何值,但它將更新兩個先前聲明的變量..因此將其放置在主循環或窗口重塑回調函數中。

您可以15頁

+0

這不會使窗口居中,使用'glfwSetWindowPos(ScreenWidth/2 - WindowWidth/2,...);'代替。 – danijar

+0

@sharethis @sharethis我沒有說它會..再次讀他的問題..他問作爲他的問題的一部分,將返回窗口大小的功能.. – iKlsR

2

這可能幫助別人在官方手冊here驗證這一點......

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是具有寬度和窗口的高度變量。

參考:http://www.glfw.org/docs/latest/monitor.html

+0

這種解決方案是正確的,但是當窗口未打開主監視器此解決方案不起作用。 – 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.