我在使用我的程序停用全屏模式时遇到问题。输入全屏正确,但尝试返回窗口模式不起作用,唯一的效果是光标再次显示。
这是为我重现问题的MCVE / SSCCE:
void ToggleFullscreen(SDL_Window* Window) {
Uint32 FullscreenFlag = SDL_WINDOW_FULLSCREEN;
bool IsFullscreen = SDL_GetWindowFlags(Window) & FullscreenFlag;
SDL_SetWindowFullscreen(Window, IsFullscreen ? 0 : FullscreenFlag);
SDL_ShowCursor(IsFullscreen);
}
int main() {
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* Window = SDL_CreateWindow("",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
bool Exit = false;
for (SDL_Event Event; !Exit;) {
SDL_WaitEvent(&Event);
if (Event.type == SDL_KEYDOWN) {
switch (Event.key.keysym.sym) {
case SDLK_f: ToggleFullscreen(Window); break;
case SDLK_q: Exit = true; break;
}
}
}
SDL_DestroyWindow(Window);
SDL_Quit();
}
SDL_SetWindowFullscreen
返回0
,就像操作成功一样。我究竟做错了什么? (我在OS X 10.10.3上使用SDL 2.0.3。)
答案 0 :(得分:6)
这看起来像一个已知问题。希望SDL开发人员能够修复它。我发现了以下错误报告。
答案 1 :(得分:2)
即使是现在,SDL_SetWindowFullscreen
仍然存在问题。我尝试使用此功能为我的视频播放器添加全屏功能。但是,在全屏和窗口模式之间转换时会随机崩溃。
我发现暂时的工作现在似乎正常工作。
SDL_DisplayMode dm;
if (SDL_GetDesktopDisplayMode(0, &dm))
{
printf("Error getting desktop display mode\n");
return -1;
}
if (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_KEYUP:
switch (event.key.keysym.sym)
{
case SDLK_f:
SDL_RestoreWindow(screen); //Incase it's maximized...
SDL_SetWindowSize(screen, dm.w, dm.h + 10);
SDL_SetWindowPosition(screen, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
}
break;
}
}
它基本上是"假的"全屏。它调整窗口大小,使客户区覆盖整个屏幕,最小化,最大化,退出按钮不在屏幕上。
希望这有帮助。
答案 2 :(得分:0)
我知道这可能是 5 年后的日期,但我遇到了同样的问题,我发现您的代码方式比需要的更复杂。所以我只是想补充一下:
//somewhere outside the loop
bool isFullScreen = true;
void toggleFullScreen(SDL_Window* window, bool currentState)
{
isFullScreen = !currentState;
SDL_SetWindowFullscreen(window, !currentState);
SDL_ShowCursor(currentState);
}
只需将 isFullscreen 放在 currenState 上,您就可以通过按键事件进行良好的切换。