2012-07-04 209 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.