将GLFW窗口设置为不可调整大小

时间:2014-11-30 05:34:54

标签: opengl glfw

我有一个GLFW3窗口,我试图从可调整大小更改为不可调整大小。

我尝试在创建窗口后更改Window Hint但这没有做任何事情,因为提示只影响要创建的窗口。

我尝试了什么:

glfwWindowHint(GLFW_RESIZABLE, GL_FALSE)

这可能吗?我认为这样做的一种方法是使用onResize函数,在设置不可调整大小后将窗口大小更改回当前大小。这看起来非常糟糕。

5 个答案:

答案 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,我会看到两个选项:

  1. 您已有的解决方法。
  2. 切换该状态时创建一个新窗口。
  3. 使用GLFW native access获取真实窗口句柄并实现每个平台的功能(您关心)。
  4. 所有变种对我来说都不太吸引人。选项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);

 ...
}
相关问题