2017-10-20 118 views
1

我需要我的SDL2程序來了解窗口是否全屏,並且我認爲我可以使用SDL_GetWindowFlags()來獲取該信息。默認情況下,我用兩個標誌初始化我的窗口:SDL_WINDOW_SHOWN和SDL_WINDOW_BORDERLESS,它們分別等於16和4。所以我期望函數返回20,但是我得到了532.而且有時也有1556,甚至在重新初始化窗口幾次後,在運行時更改爲532。但是,532在運行時不會更改爲1556。SDL_GetWindowFlags()返回看似隨機的值

這些標誌如何工作?

bool init(int windowflags) 
{ 
    bool success = true; 
    if(SDL_Init(SDL_INIT_VIDEO) < 0) 
    { 
     printf("Video initialization failed: %s\n", SDL_GetError()); 
     success = false; 
    } 
    else 
    { 
     gWindow = SDL_CreateWindow("VIRGULE", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIN_W, WIN_H, SDL_WINDOW_SHOWN + windowflags); 
     if(gWindow == NULL) 
     { 
      printf("Window could not be created: %s\n", SDL_GetError()); 
      success = false; 
     } 
     else 
     { 
      gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED + SDL_RENDERER_TARGETTEXTURE); 
      if(gRenderer == NULL) 
      { 
       printf("Renderer could not be created: %s\n", SDL_GetError()); 
       success = false; 
      } 
      else 
      { 
       gTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_UNKNOWN, SDL_TEXTUREACCESS_TARGET, SCR_W, SCR_H); 
       if(gTexture == NULL) 
       { 
        printf("Texture creation failed: %s\n", SDL_GetError()); 
        success = false; 
       } 
      } 
     } 
    } 
    printf("%i\n", SDL_GetWindowFlags(gWindow)); 
    //this is either prints 1556 or 532 
    return success; 
} 

回答

3

看起來你的標誌值改變基於各國的SDL_WINDOW_INPUT_FOCUSSDL_WINDOW_MOUSE_FOCUS。但沒關係。標誌值始終在變化。你不應該擔心旗幟的總價值。你只需要知道你正在看的標誌位的價值。當值爲5321556(如果您查看二進制文件),SDL_WINDOW_SHOWNSDL_WINDOW_BORDERLESS標誌仍然置1。

就搶位標誌的值:

int flags    = SDL_GetWindowFlags(gWindow); 
int window_shown  = (flags & SDL_WINDOW_SHOWN) ? true : false; 
int window_borderless = (flags & SDL_WINDOW_BORDERLESS) ? true : false; 
int window_fullscreen = (flags & SDL_WINDOW_FULLSCREEN) ? true : false; 

這裏是你可以用它來查看基於該值設置了什麼樣的標誌功能:

void show_flags(int flags); 

int main() 
{ 
    show_flags(20); 
    show_flags(532); 
    show_flags(1556); 

    return 0; 
} 

void show_flags(int flags) { 

    printf("\nFLAGS ENABLED: (%d)\n", flags); 
    printf("=======================\n"); 
    if(flags & SDL_WINDOW_FULLSCREEN)   printf("SDL_WINDOW_FULLSCREEN\n"); 
    if(flags & SDL_WINDOW_OPENGL)    printf("SDL_WINDOW_OPENGL\n"); 
    if(flags & SDL_WINDOW_SHOWN)    printf("SDL_WINDOW_SHOWN\n"); 
    if(flags & SDL_WINDOW_HIDDEN)    printf("SDL_WINDOW_HIDDEN\n"); 
    if(flags & SDL_WINDOW_BORDERLESS)   printf("SDL_WINDOW_BORDERLESS\n"); 
    if(flags & SDL_WINDOW_RESIZABLE)   printf("SDL_WINDOW_RESIZABLE\n"); 
    if(flags & SDL_WINDOW_MINIMIZED)   printf("SDL_WINDOW_MINIMIZED\n"); 
    if(flags & SDL_WINDOW_MAXIMIZED)   printf("SDL_WINDOW_MAXIMIZED\n"); 
    if(flags & SDL_WINDOW_INPUT_GRABBED)  printf("SDL_WINDOW_INPUT_GRABBED\n"); 
    if(flags & SDL_WINDOW_INPUT_FOCUS)  printf("SDL_WINDOW_INPUT_FOCUS\n"); 
    if(flags & SDL_WINDOW_MOUSE_FOCUS)  printf("SDL_WINDOW_MOUSE_FOCUS\n"); 
    if(flags & SDL_WINDOW_FULLSCREEN_DESKTOP) printf("SDL_WINDOW_FULLSCREEN_DESKTOP\n"); 
    if(flags & SDL_WINDOW_FOREIGN)   printf("SDL_WINDOW_FOREIGN\n"); 
} 

更多的標誌可以在這裏找到:https://wiki.libsdl.org/SDL_WindowFlags

輸出:

FLAGS ENABLED: (20) 
======================= 
SDL_WINDOW_SHOWN  
SDL_WINDOW_BORDERLESS 

FLAGS ENABLED: (532) 
======================= 
SDL_WINDOW_SHOWN  
SDL_WINDOW_BORDERLESS 
SDL_WINDOW_INPUT_FOCUS 

FLAGS ENABLED: (1556) 
======================= 
SDL_WINDOW_SHOWN  
SDL_WINDOW_BORDERLESS 
SDL_WINDOW_INPUT_FOCUS 
SDL_WINDOW_MOUSE_FOCUS