3

我正在编写一个显示动画的程序,该动画取决于显示器的大小。为了让它与多个显示器一起工作,我有一个 display_data 对象数组:

struct window_data
{
    SDL_Rect bounds;
    SDL_Window *window;
};

并为每个显示初始化这些:

int numdisplays = SDL_GetNumVideoDisplays();
std::vector< window_data > screens( numdisplays );
for( int i = 0 ; i < numdisplays ; ++i )
{
    SDL_GetDisplayBounds( i, &( screens[ i ].bounds ) );
    screens[ i ].window
        = SDL_CreateWindow( "Display", screens[ i ].bounds.x,
                            screens[ i ].bounds.y, screens[ i ].bounds.w,
                            screens[ i ].bounds.h, SDL_WINDOW_FULLSCREEN );
}

只要我的鼠标光标在主显示器中,这工作就很好,但是如果我在辅助显示器中使用光标启动程序,它将在辅助显示器中绘制两个窗口,导致只有第二个窗口可见。这种行为似乎只取决于光标的位置,而不是我运行程序的终端窗口。

我已经验证,无论光标位置如何,都可以找到相同的显示数字和边界,因此我对程序行为的变化感到困惑。这是 SDL2 的预期行为还是错误?在任何一种情况下,有人可以提出解决方法吗?

编辑:鼠标依赖出现在带有 XFCE 的 Debian 上。我也在 Windows 上试过这个,它在第二台显示器上输出两个窗口,不管鼠标位置如何。

4

2 回答 2

2

您可以SDL_WINDOWPOS_UNDEFINED_DISPLAY将位置参数中的宏SDL_CreateWindow与参数结合使用SDL_WINDOW_FULLSCREEN

就像是:

SDL_CreateWindow(
        "Window Name",
        SDL_WINDOWPOS_UNDEFINED_DISPLAY(display),
        SDL_WINDOWPOS_UNDEFINED_DISPLAY(display),
        0,
        0,
        SDL_WINDOW_FULLSCREEN),

该宏没有很好的文档记录,但是您可以通过阅读源代码清楚地了解它是如何工作的。

于 2019-06-06T12:51:53.710 回答
1

尝试SDL_WINDOW_BORDERLESS代替SDL_WINDOW_FULLSCREEN.

我不确定多个全屏窗口是否可以有意义地共存,尤其是当您考虑输入抓取时。

尝试这样的事情:

#include <SDL2/SDL.h>
#include <vector>

struct window_data
{
    SDL_Rect bounds;
    SDL_Window *window;
    SDL_Renderer* renderer;
};

int main( int argc, char **argv )
{
    if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 )
        return EXIT_FAILURE;

    std::vector< window_data > screens( SDL_GetNumVideoDisplays() );
    for( size_t i = 0; i < screens.size(); ++i )
    {
        window_data& screen = screens[ i ];
        SDL_GetDisplayBounds( i, &screen.bounds );
        screen.window = SDL_CreateWindow
            ( 
            "Display", 
            screen.bounds.x, screen.bounds.y, 
            screen.bounds.w, screen.bounds.h, 
            SDL_WINDOW_BORDERLESS
            );
        screen.renderer = SDL_CreateRenderer( screen.window, 0, SDL_RENDERER_ACCELERATED );
        SDL_ShowWindow( screen.window );
    }

    bool running = true;
    while( running )
    {
        SDL_Event ev;
        while( SDL_PollEvent( &ev ) )
        {
            if( ev.type == SDL_QUIT )  running = false;
            if( ev.type == SDL_KEYUP &&
                ev.key.keysym.sym == SDLK_ESCAPE ) running = false;
        }

        for( size_t i = 0; i < screens.size(); ++i )
        {
            window_data& screen = screens[ i ];
            SDL_SetRenderDrawColor( screen.renderer, 255, 0, 0, 255 );
            SDL_RenderFillRect( screen.renderer, NULL );
            SDL_RenderPresent( screen.renderer );
        }

        SDL_Delay( 33 );
    }

    for( size_t i = 0; i < screens.size(); ++i )
    {
        window_data& screen = screens[ i ];
        SDL_DestroyRenderer( screen.renderer );
        SDL_DestroyWindow( screen.window );
    }

    SDL_Quit();

    return EXIT_SUCCESS;
}
于 2013-09-17T19:30:38.463 回答