SDL_GetWindowFlags() 返回看似随机的值

SDL_GetWindowFlags() returns seemingly random values

本文关键字:随机 返回 GetWindowFlags SDL      更新时间:2023-10-16

我需要我的 SDL2 程序知道窗口是否全屏,我想我可以使用 SDL_GetWindowFlags() 获取该信息。默认情况下,我使用两个标志初始化我的窗口:SDL_WINDOW_SHOWN 和 SDL_WINDOW_BORDERLESS,分别等于 16 和 4。所以我预计该函数返回 20,但我得到 532。有时还有 1556,在重新初始化窗口几次后,甚至在运行时更改为 532。但是,532 在运行时永远不会更改为 1556。

这些标志如何工作?

bool init( int windowflags )
{
    bool success = true;
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "Video initialization failed: %sn", 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: %sn", 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: %sn", 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: %sn", SDL_GetError() );
                    success = false;
                }
            }
        }
    }
    printf( "%in", SDL_GetWindowFlags( gWindow ) );
    //this is either prints 1556 or 532
    return success;
}

看起来您的标志值正在根据SDL_WINDOW_INPUT_FOCUSSDL_WINDOW_MOUSE_FOCUS的状态而变化。但没关系。标志值一直在变化。您不必担心标志的总价值。您只需要知道您正在监视的标志位的值。SDL_WINDOW_SHOWNSDL_WINDOW_BORDERLESS 标志在5321556时仍会设置(如果以二进制形式查看)。

只需获取位标志的值:

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_FULLSCREENn");
    if(flags & SDL_WINDOW_OPENGL)             printf("SDL_WINDOW_OPENGLn");
    if(flags & SDL_WINDOW_SHOWN)              printf("SDL_WINDOW_SHOWNn");
    if(flags & SDL_WINDOW_HIDDEN)             printf("SDL_WINDOW_HIDDENn");
    if(flags & SDL_WINDOW_BORDERLESS)         printf("SDL_WINDOW_BORDERLESSn");
    if(flags & SDL_WINDOW_RESIZABLE)          printf("SDL_WINDOW_RESIZABLEn");
    if(flags & SDL_WINDOW_MINIMIZED)          printf("SDL_WINDOW_MINIMIZEDn");
    if(flags & SDL_WINDOW_MAXIMIZED)          printf("SDL_WINDOW_MAXIMIZEDn");
    if(flags & SDL_WINDOW_INPUT_GRABBED)      printf("SDL_WINDOW_INPUT_GRABBEDn");
    if(flags & SDL_WINDOW_INPUT_FOCUS)        printf("SDL_WINDOW_INPUT_FOCUSn");
    if(flags & SDL_WINDOW_MOUSE_FOCUS)        printf("SDL_WINDOW_MOUSE_FOCUSn");
    if(flags & SDL_WINDOW_FULLSCREEN_DESKTOP) printf("SDL_WINDOW_FULLSCREEN_DESKTOPn");
    if(flags & SDL_WINDOW_FOREIGN)            printf("SDL_WINDOW_FOREIGNn");
}

更多标志可以在这里找到: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