2017-10-20 1 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 플래그가 계속 설정됩니다.

그냥 비트 플래그의 값을 잡아 :

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"); 
} 

더 플래그는 여기에서 찾을 수 있습니다 : 여기

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; 

당신이 값을 기준으로 설정되어 어떤 플래그를 참조하는 데 사용할 수있는 기능입니다 : 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 
관련 문제