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

ghhkc1vu  于 2022-11-04  发布在  其他
关注(0)|答案(6)|浏览(295)

我有一个GLFW3窗口,我试图改变大小从可调整为不可调整。
我尝试在创建窗口后更改窗口提示,但这没有任何作用,因为提示只影响要创建的窗口。
我尝试的是:

glfwWindowHint(GLFW_RESIZABLE, GL_FALSE)

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

2admgd59

2admgd591#

您的方法在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, 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;
}

编译并运行:

g++ -std=c++11 -Wall -Wextra -pedantic-errors -o main.out main.cpp -lglfw
./main.out

当我将光标悬停在已创建窗口的边框上时,光标始终不会变为调整大小模式。

pdkcd3nj

pdkcd3nj2#

GLFW目前没有API用于在创建窗口后更改该状态。
当您想要使用GLFW时,我看到两个选项:
1.您已经有了解决方法。
1.在切换该状态时创建新窗口。
1.使用GLFW native access获取真实的的窗口句柄,并为每个平台(您关心的)实现该特性。
所有的变体对我来说似乎都不太吸引人。选项2尤其糟糕,因为GL上下文与GLFW中的窗口绑定的方式,通过使用额外的(不可见的)窗口和共享GL上下文应该是可能的,但这将是丑陋的。
选项3的优点是,一旦在所有相关平台上实现,它应该可以完美地工作。由于GLFW是开源的,这也启用了选项3b):直接在GLFW中实现它并扩展API。2你甚至可以把它集成到GLFW的官方版本中。

uwopmtnx

uwopmtnx3#

可以使用以下代码更改现有窗口的GLFW_RESIZABLE属性:

bool enable;
glfwSetWindowAttrib(window, GLFW_RESIZABLE, enable);
sd2nnvve

sd2nnvve4#

这*工作***,但我强烈推荐其他解决方案,因为这是只有当你严格需要能够切换**它。

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 :)
}
m0rkklqb

m0rkklqb5#

我的解决方案:

// 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);
    }
}
m528fe3b

m528fe3b6#

这对我在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);

 ...
}

相关问题