当前位置: 首页 > 知识库问答 >
问题:

GLFW非响应全屏窗口

仇和蔼
2023-03-14

我有一些问题与GLFW的窗口创建。我希望有一个程序能够在窗口和全屏模式之间切换。要在GLFW 2.7.8中做到这一点,必须首先销毁活动窗口,然后创建一个新的窗口。我读到3.0版本支持多个窗口,但它仍在开发中。

我提供了自己的功能来处理键盘输入。使用最初的400×400窗口,程序按预期运行;它将在f或F上进入全屏,当按下转义键时退出,当按下任何其他键时都会抱怨。

但是,当进入全屏模式时,窗口对我提供的键盘功能没有响应。它将继续在main()中的循环中运行,并将响应类似于glfwGetKey(GLFW\u KEY\u ESC)测试的内容。无论是否启用鼠标光标,光标都不会出现。

再次创建全屏窗口,KeyboardCallback函数返回主循环。我想了解为什么全屏窗口不能使用我的键盘功能,为什么不能正确显示。

我并没有在窗口上绘制任何东西,因为我正试图获得一些使用各种窗口抽象库的经验。画一个简单的三角形并没有解决问题,全屏窗口仍然是黑色的。

我的代码如下:

#include <stdio.h>
#include <stdlib.h>

// glfw32 - 2.7.8
#include <GL\glfw.h>

#pragma comment (lib, "GLFW.lib")
#pragma comment (lib, "opengl32.lib")

using namespace std;

// constants and globals
const int WINDOW_WIDTH=400, WINDOW_HEIGHT=400;
static bool fullscreen=false;

// function declarations
void GLFWCALL KeyboardCallback(int key, int action);
void FatalError(const char* msg) {
  fprintf(stderr, "ERROR: Failure in \"%s\"\n", msg);
  exit(1);
}


int main() {
  // ititialize GLFW
  glfwInit();
  glfwEnable(GLFW_MOUSE_CURSOR);
  glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
  glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);

  // initial window, 400x400 with 32-bit depth buffer in windowed mode
  glfwOpenWindow(WINDOW_WIDTH, WINDOW_HEIGHT, 0,0,0,0, 32, 0, GLFW_WINDOW);
  glfwSetWindowTitle("Simple Title");
  glfwSetWindowPos(0, 0);

  // set custom keyboard callback
  glfwSetKeyCallback(KeyboardCallback);

  while (true) {  // loop until exit
    glClear(GL_COLOR_BUFFER_BIT);
    glfwSwapBuffers();  

    // debug
    //printf("Looping...\n");
    if ( glfwGetKey(GLFW_KEY_ESC) ) {break;} 
  }

  glfwTerminate();
  printf("\nHave a nice day\n");
  return 0;
}


void GLFWCALL KeyboardCallback(int key, int action) {
  //printf("In keyboard function\n");

  if (action) {    // if key DOWN,
    switch(key) {  // do something...
      case 'f':
      case 'F':  {
        fullscreen = !fullscreen;
        printf("Toggle Fullscreen: %s\n", (fullscreen ? "On" : "Off"));
        glfwCloseWindow();

        if (! glfwOpenWindow(WINDOW_WIDTH, WINDOW_HEIGHT, 0,0,0,0, 32, 0,
                             fullscreen ? GLFW_FULLSCREEN : GLFW_WINDOW)) {
          FatalError("toggle fullscreen");
        }
        glfwSetWindowTitle("New Title");
        break;
      }

      case GLFW_KEY_ESC:  {
        printf("\nGoodbye cruel world...\n");
        glfwTerminate();
        exit(0);
      }

      default:  {
        printf("Key not implemented: %c\n", key);
        break;
      }
    }
  }
  printf("Exiting keyboard function\n");
}

我在这里尝试了詹姆斯的方法,但没有效果。有我忘记设置的GLFW标志吗?

编辑------5/20

我有一个想法。当窗口被破坏时,可能我的回调被取消注册。事实证明,在创建新窗口时重新注册我的函数会使窗口响应。

虽然这解决了我最初的问题,但我现在面临一个新的问题。我不能正确渲染到新窗口。我可以插入glClear(GL_COLOR_BUFFER_BIT);到我的主循环中,这将成功地为新窗口设置背景颜色。由于某种原因,它不与我的html" target="_blank">数组和缓冲区交互来绘制图像。
代码与尝试绘图

编辑------- 5/21

我将我的代码转换为GLFW 3.0.0。窗口管理更干净(尽管更复杂),我没有渲染问题。可能是因为我必须明确声明要使用的当前上下文。

我仍然希望解决渲染问题,这是出于好奇,也是为了我是否/何时返回2.7。

共有1个答案

伯鸿达
2023-03-14

目前GLFW的事件队列未被泵送。您必须设置GLFW_AUTO_POLL_EVENTS选项,以便glfwSwapBuffers泵送事件队列,或者在主事件循环迭代开始时调用glfwPollEvents。

 类似资料:
  • 背景图像在大屏幕上不显示为完整图像,但在小屏幕上很合适。 在所有的屏幕上,图像都有一个特定的维度来作为响应?

  • 问题内容: 我对前端开发和基础非常陌生。 我正在尝试成为响应时按比例缩小的全屏图像。 谁能告诉我我在做什么错?它可以正确缩放,但无法显示完整图像。我还希望将其放在移动设备上,这可能吗? HTML: CSS: 问题答案: //HTML 要么 要么

  • 提前谢了。

  • 我试图在linux red hat上使用GLFW打开一个OpenGL全屏窗口。我有一个桌面,它跨越两个显示器,总分辨率为3840*1080。 我有两个问题:1。窗口仅在一台显示器上打开,最大窗口宽度为1920(单个显示器的宽度)。2.窗口的最大高度是1003(我认为是屏幕的高度减去任务栏和顶栏的高度)。 这是我用来打开窗口的代码: 输出:宽度=1920高度=1003 编辑:我使用xrandr检查可

  • 我对glfw有一个小问题。 我的代码非常简单,我只想创建一个空窗口。 } 此代码编译,但当我运行它时,我只有一个白色窗口。窗口的标题是正确的,但里面的一切都是白色的......我尝试像那样使用glClearColor。 但是我的窗户仍然是白色的....我用的是visual studio 2015。 怎么弄个黑窗? 编辑: 忘了补充这个:glfwMakeContextCurrent(window);