我正在编写一个显示动画的程序,该动画取决于显示器的大小。为了使其适用于多个显示器,我有一个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上试过它,它在第二台显示器上输出两个窗口,无论鼠标位置如何。答案 0 :(得分: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;
}
答案 1 :(得分:1)
您可以在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),
该宏没有很好的文档说明,但是您可以通过阅读源代码来清楚地了解宏的工作原理。