首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLFW无响应全屏窗口

GLFW无响应全屏窗口
EN

Stack Overflow用户
提问于 2013-05-20 05:25:25
回答 1查看 1.6K关注 0票数 1

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

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

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

同样,创建了全屏窗口,KeyboardCallback函数返回到主循环。我想了解为什么全屏窗口不能使用我的键盘功能,以及为什么它没有正确显示。

我不会将任何东西绘制到窗口,因为我正试图获得一些特定的各种窗口抽象库的经验。画一个简单的三角形并不能解决问题,全屏窗口仍然是黑色的。

我的代码如下:

代码语言:javascript
复制
#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 );到我的主循环,这将成功地设置一个新窗口的背景颜色。由于某些原因,它不会与我的数组和缓冲区交互来绘制图像。

图解代码

编辑? 5/21。

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

我仍然想解决渲染问题,出于好奇和如果/当我回到2.7。

EN

回答 1

Stack Overflow用户

发布于 2013-05-20 12:18:11

现在,GLFW的事件队列没有被抽运。您必须设置GLFW_AUTO_POLL_EVENTS选项,以便glfwSwapBuffers泵出事件队列,或者在主事件循环迭代开始时调用glfwPollEvents。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16643103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档