我有一个GLFW3窗口,我试图从可调整大小更改为不可调整大小。
我尝试在创建窗口后更改Window Hint但这没有做任何事情,因为提示只影响要创建的窗口。
我尝试了什么:
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE)
这可能吗?我认为这样做的一种方法是使用onResize函数,在设置不可调整大小后将窗口大小更改回当前大小。这看起来非常糟糕。
答案 0 :(得分:8)
您的方法适用于Ubuntu 18.10中的GLFW 3.2.1-1:
的main.cpp
#include <GLFW/glfw3.h>
int main(void) {
GLFWwindow* window;
if (!glfwInit())
return -1;
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
window = glfwCreateWindow(640, 480, __FILE__, NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
while (!glfwWindowShouldClose(window)) {
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
编译并运行:
g++ -std=c++11 -Wall -Wextra -pedantic-errors -o main.out main.cpp -lglfw
./main.out
当我将鼠标悬停在已创建窗口的边框上时,光标永远不会更改为调整大小模式。
答案 1 :(得分:5)
GLFW目前没有用于在创建窗口后更改该状态的API。
如果您想使用GLFW,我会看到两个选项:
所有变种对我来说都不太吸引人。选项2特别糟糕,因为GL上下文与GLFW中的窗口关联的方式,应该可以使用额外的(不可见的)窗口和共享的GL上下文,但它会很难看。
选项3的优点是,一旦为所有相关平台实施,它应该完美无缺。由于GLFW是开源的,这也启用了选项3b):直接在GLFW中实现它并扩展API。您甚至可以将其集成到官方GLFW版本中。
答案 2 :(得分:0)
此 有效 ,但我强烈推荐其他解决方案,因为只有在您必须能够切换时才会这样做。< / p>
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 :)
}
答案 3 :(得分:0)
我的解决方案:
// 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);
}
}
答案 4 :(得分:0)
这在GLFW 3.3上对我有效,但请小心将其放在glfwInit()之后
int main( void )
{
// Initialise GLFW
if( !glfwInit() )
{
fprintf( stderr, "Failed to initialize GLFW\n" );
getchar();
return -1;
}
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
...
}