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

Opengl 将GLFW窗口设置为不可调整大小,opengl,glfw,Opengl,Glfw,我有一个GLFW3窗口,我正在尝试从可调整大小更改为不可调整大小 我尝试在创建窗口后更改窗口提示,但这没有任何作用,因为提示只影响要创建的窗口 我尝试的是: glfwWindowHint(GLFW_RESIZABLE, GL_FALSE) 这可能吗?我想到的一种方法是使用onResize函数,在设置为不可调整大小后,将窗口大小更改回当前大小。这似乎很有问题。GLFW目前没有API在创建窗口后更改该状态 当您想要使用GLFW时,我看到两个选项: 您已有的解决方法 切换该状态时创建一个新窗口 使用

我有一个GLFW3窗口,我正在尝试从可调整大小更改为不可调整大小

我尝试在创建窗口后更改窗口提示,但这没有任何作用,因为提示只影响要创建的窗口

我尝试的是:

glfwWindowHint(GLFW_RESIZABLE, GL_FALSE)

这可能吗?我想到的一种方法是使用onResize函数,在设置为不可调整大小后,将窗口大小更改回当前大小。这似乎很有问题。

GLFW目前没有API在创建窗口后更改该状态

当您想要使用GLFW时,我看到两个选项:

  • 您已有的解决方法
  • 切换该状态时创建一个新窗口
  • 使用获取真实的窗口句柄,并为每个平台(您关心的)实现该功能
  • 对我来说,所有的变体似乎都不太吸引人。选项2尤其糟糕,因为GLFW中GL上下文与窗口的关联方式,应该可以使用额外(不可见)窗口和共享GL上下文,但这样做会很难看


    选项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);
    
     ...
    }