2015-06-03 79 views
5

我在使用我的程序停用全屏模式時遇到問題。進入全屏幕會正常發生,但嘗試返回到窗口模式不起作用,唯一的影響是光標會再次顯示。SDL2:如何正確切換全屏?

這裏的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

即使現在仍有似乎是一個問題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; 
    } 
} 

它基本上是「假」全屏。它調整窗口的大小,使客戶區覆蓋整個屏幕,最小化,最大化,退出按鈕不在屏幕上。

希望這會有所幫助。