Opengl 将GLFW窗口设置为不可调整大小
我有一个GLFW3窗口,我正在尝试从可调整大小更改为不可调整大小 我尝试在创建窗口后更改窗口提示,但这没有任何作用,因为提示只影响要创建的窗口 我尝试的是:Opengl 将GLFW窗口设置为不可调整大小,opengl,glfw,Opengl,Glfw,我有一个GLFW3窗口,我正在尝试从可调整大小更改为不可调整大小 我尝试在创建窗口后更改窗口提示,但这没有任何作用,因为提示只影响要创建的窗口 我尝试的是: glfwWindowHint(GLFW_RESIZABLE, GL_FALSE) 这可能吗?我想到的一种方法是使用onResize函数,在设置为不可调整大小后,将窗口大小更改回当前大小。这似乎很有问题。GLFW目前没有API在创建窗口后更改该状态 当您想要使用GLFW时,我看到两个选项: 您已有的解决方法 切换该状态时创建一个新窗口 使用
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE)
这可能吗?我想到的一种方法是使用onResize函数,在设置为不可调整大小后,将窗口大小更改回当前大小。这似乎很有问题。GLFW目前没有API在创建窗口后更改该状态 当您想要使用GLFW时,我看到两个选项:
选项3的优点是,一旦在所有相关平台上实施,它就可以完美地工作。由于GLFW是开源的,这也支持选项3b):直接在GLFW中实现并扩展API。您甚至可以将其集成到官方GLFW版本中 从Ubuntu18.10中的GLFW 3.2.1-1开始,您的方法就可以使用了: main.cpp
#include <GLFW/glfw3.h>
int main(void) {
GLFWwindow* window;
if (!glfwInit())
return -1;
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
window = glfwCreateWindow(640, 480, __FILE__, NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
while (!glfwWindowShouldClose(window)) {
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
当我将鼠标悬停在已创建窗口的边框上时,光标永远不会更改为调整大小模式。此方法有效,但我强烈推荐其他解决方案,因为这仅在您严格需要能够切换它的情况下使用
IntBuffer wid = BufferUtils.createIntBuffer(1);
IntBuffer hei = BufferUtils.createIntBuffer(1);
glfwGetWindowSize(window, wid, hei);
int windowWidth = wid.get();
int windowHeight = hei.get(); // I recommend making this public
while(!glfwWindowShouldClose(window)) {
glfwSetWindowSize(window, windowWidth, windowHeight);
// People can still maximize the window ... Comment if you have a solution :)
}
我的解决方案:
// before create:
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
// create window
// ...
// after create
void setResizable(arg) {
if(arg)
glfwSetWindowSizeLimits(window, 0, 0, 0xffff, 0xffff);
else {
int w, h;
glfwGetWindowSize(window, &w, &h);
glfwSetWindowSizeLimits(window, w, h, w, h);
}
}
这在GLFW 3.3中对我有效,但请小心将其放在glfwInit()之后
我将命令放在glfwCreateWindow(…)之前,它就可以工作了。现在,我无法再调整窗口的大小。(版本:GLFW 3.0.4)我想你现在可以用
glfwSetWindowAttrib
来完成。文档中说:>GLFW_resizeable表示用户是否可以调整指定窗口的大小。这可以在创建之前使用GLFW_可调整大小的窗口提示进行设置,也可以在创建之后使用glfwSetWindowAttrib进行设置。第二个参数应该是GLFW_FALSE
,而不是GL_FALSE
!向下投票者,谢谢你告诉我为什么这个答案是错误的,这样我就可以学习和改进信息。这里要完全正确:glfwWindowHint
的参数应该是GLFW_TRUE
和GLFW_FALSE
(而不是GL_u*
)调整大小图标和最大化控件仍将处于活动状态,所以这只是一个(相当脏的)为什么要在这里调用getChar()
?
// before create:
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
// create window
// ...
// after create
void setResizable(arg) {
if(arg)
glfwSetWindowSizeLimits(window, 0, 0, 0xffff, 0xffff);
else {
int w, h;
glfwGetWindowSize(window, &w, &h);
glfwSetWindowSizeLimits(window, w, h, w, h);
}
}
int main( void )
{
// Initialise GLFW
if( !glfwInit() )
{
fprintf( stderr, "Failed to initialize GLFW\n" );
getchar();
return -1;
}
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
...
}