2013-05-20 64 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