退出 glutFullScreen()

Posted

技术标签:

【中文标题】退出 glutFullScreen()【英文标题】:Exiting glutFullScreen() 【发布时间】:2012-10-26 09:08:08 【问题描述】:

我不明白为什么当我按“f”时它进入全屏但没有退出全屏。在这个方法的开头我设置了bool fullscreen = false;

这是我的切换代码:

case 'f': //toggle screenmode
    if(!fullscreen)
        glutFullScreen();
        fullscreen = true;
     else if(fullscreen)
        glutReshapeWindow(1200, 900);
        glutPositionWindow(0,0);
        fullscreen = false;
    
    break;

【问题讨论】:

“在这个方法的顶部没有退出全屏”——这是什么意思? 当我按 f 进入全屏但不能回到原来的窗口状态?如果这有意义 你可以切换到freeglut并使用LeaveFullScreen/FullscreenToggle。 顺便说一句:你不需要else if(fullscreen),只需要else 【参考方案1】:

在这个方法的顶部我设置了 bool fullscreen = false;

每次你按下一个键,GLUT 都会调用你的键盘处理程序。在键盘处理程序的顶部,创建一个名为 fullscreenbool 变量并将其值设置为 false。无论您是否处于全屏模式,都会发生这种情况。每按一次键,就会发生这种情况。

如果你想保留一个实际上跟踪你当前是否全屏的布尔变量,那么你需要使用一个全局。而且您需要在函数的开头设置它。您在创建窗口时设置一次,仅在更改窗口的全屏状态时再次设置。

【讨论】:

【参考方案2】:

恢复原来的窗口大小

...将ReshapeWindow和PositionWindow的调用顺序切换为

glutPositionWindow(0,0);
glutReshapeWindow(1200, 900);

否则会回到窗口模式,但不适应你指定的窗口大小!

【讨论】:

【参考方案3】:

问题不在于您在上面发布的代码中,根据glutFullScreen specification,一旦调用 glutReshapeWindow 或 glutPositionWindow,窗口应该退出全屏模式。

在这个方法的顶部我设置了 bool fullscreen = false;

我敢打赌,你在同一个函数中设置了这个(不是作为全局变量),当你按下 f 时,这个变量总是为假

【讨论】:

【参考方案4】:

您必须定义一个全局变量,而不是在方法的开头定义 bool。否则每次调用该方法时,它会将全屏布尔值设置为 0,并认为它不是处于全屏模式。此外,您可能不想接受 euphrat 的回答,他对方法组织提出了一个有效的观点。

【讨论】:

【参考方案5】:

试试这个:

case 'f': //toggle screenmode
    fullScreen = !fullScreen;
    if (fullScreen) 
        glutFullScreen();
     else 
        glutReshapeWindow(1200, 900);
        glutPositionWindow(0,0);
    
    break;

【讨论】:

【参考方案6】:

虽然它可能无法直接回答问题,但我发现它是发布全屏和退出源代码的好地方。

使用 切换和恢复全屏

myGame.c

...
glutSpecialFunc(handleSpecial);

void handleSpecial(int key, int x, int y) 
  oglHandleFullScreen(key, x, y);

...

如果您希望改为响应键盘事件 (glutKeyboardFunc),请确保将以下 oglHandleFullScreen 的签名更改为 (unsigned char key, int x, int y)

全屏.h

void oglHandleFullScreen(int key, int x, int y);
void oglWindowed(int positionX, int positionY, int width, int height);
void oglFullScreen();

全屏.c

#include <GL/glut.h>
#include "fullscreen.h"

int isFullScreen = 0;
int previousPosition[2] =  0, 0 ;
int previousSize[2] =  100, 100 ;

void oglHandleFullScreen(int key, int x, int y) 
  if (key != GLUT_KEY_F11)  // Respond to F11 key (glutSpecialFunc).
    return;
  

  if (isFullScreen) 
    oglWindowed(previousPosition[0], previousPosition[1],
                previousSize[0], previousSize[1]);
   else 
    previousPosition[0] = glutGet(GLUT_WINDOW_X);
    previousPosition[1] = glutGet(GLUT_WINDOW_Y);
    previousSize[0] = glutGet(GLUT_WINDOW_WIDTH);
    previousSize[1] = glutGet(GLUT_WINDOW_HEIGHT);
    oglFullScreen();
  
  isFullScreen = !isFullScreen;


void oglWindowed(int positionX, int positionY, int width, int height) 
  glutReshapeWindow(width, height);
  glutPositionWindow(positionX, positionY);


void oglFullScreen() 
  glutFullScreen();

【讨论】:

【参考方案7】:

在这种情况下,您可能希望在 bool 之前添加一个 static 关键字,以使该变量仅初始化一次。

更安全的方法是使 fullscreen 全局化,因为 static 局部变量可能在编译器和 c++ 标准中以不同方式实现。

编辑添加代码sn-p:

static bool fullscreen = false;

这应该可以解决每次调用函数时初始化变量的问题,并且按照 c++11 标准应该是线程安全的

(很多编译器可能另有说法。根据另一个问题的接受答案:Is static init thread-safe with VC2010?,Visual Studio 仅支持 VS2015 中的 c++11 的此功能)

更好的选择可能是使用全局变量(包装到一个类中不适合这个目的)。

编辑:此外,尽管语法简单,但这个 c++11 功能在频繁调用时代价高昂。(参见Cost of thread-safe local static variable initialization in C++11?)

(虽然按下键并不像以高 FPS 绘制顶点那样频繁……但在性能关键时不要使用它……)

【讨论】:

以上是关于退出 glutFullScreen()的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 中的 BMP 屏幕截图

$?:退出状态和退出状态码

Flutter:退出应用

苹果手机怎么退出游戏

linux 怎样退出vimdiff比较

linux里面保存退出命令是啥?