2013-05-20 63 views
1

我在GLFW的窗口创建中遇到了一些问题。我想要一个能够在窗口模式和全屏模式之间切换的程序。要在GLFW 2.7.8中执行此操作,首先必须销毁活动窗口,然后创建一个新窗口。我读过3.0版本支持多窗口,但仍在开发中。GLFW无响应全屏窗口

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

但是,当进入全屏模式时,窗口对于我提供的键盘功能无响应。它将继续运行main()中的循环,并会响应glfwGetKey(GLFW_KEY_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"); 
} 

我想詹姆斯的做法从here,但没有效果。我忘了设置GLFW标志吗?

编辑------- 5/20

我有一个想法。也许我的回调在窗口被销毁时未被注册。原来,当新窗口被创建时,重新注册我的函数使窗口响应。

虽然这解决了我原来的问题,但我现在正面临一个新问题。我无法正确渲染到新窗口。我可以在我的主循环中插入glClear(GL_COLOR_BUFFER_BIT);,它将成功设置新窗口的背景色。出于某种原因,它不会与我的数组和缓冲区交互来绘制图像。
Code with attempted drawing

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

我转换我的代码GLFW 3.0.0。窗口管理更清洁(虽然更复杂),我没有渲染问题。可能是因为我明确说明要使用的当前上下文。

我仍然想解决渲染问题,出于好奇以及是否/当我回到2.7。

+0

您是否曾尝试在再次调用glfwOpenWindow(..)之前重置您的glfw窗口提示? – dinony

+0

是的。我将这些提示分解到'WindowPrep'函数中,并在旧窗口被销毁和新窗口被创建时尝试调用它。它对渲染图像没有影响。 – Sithregal

+0

您不应该从GLFW回调关闭GLFW窗口。 – elmindreda

回答

3

现在GLFW的事件队列不是抽了。您必须设置GLFW_AUTO_POLL_EVENTS选项,以便glfwSwapBuffers可以泵送事件队列,或者在主事件循环迭代开始时调用glfwPollEvents

+0

我试过两种选择。对'GLFW_AUTO_POLL_EVENTS'标志使用'glfwEnable()'什么也不做。 在我的循环开始处使用'glfwPollEvents()'会导致呈现不正确的三角形(屏幕的1/8楔形),而STILL对我的KeyboardCallback函数没有响应。 – Sithregal

+0

GLFW 2中默认启用自动轮询。 – elmindreda