退出 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 都会调用你的键盘处理程序。在键盘处理程序的顶部,创建一个名为 fullscreen
的 bool
变量并将其值设置为 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()的主要内容,如果未能解决你的问题,请参考以下文章