Jac*_*Nel 10
SDL2使用全局屏幕空间坐标系.每个显示设备在此坐标空间内都有自己的边界.以下示例在第二个显示设备上放置一个窗口:
// enumerate displays
int displays = SDL_GetNumVideoDisplays();
assert( displays > 1 ); // assume we have secondary monitor
// get display bounds for all displays
vector< SDL_Rect > displayBounds;
for( int i = 0; i < displays; i++ ) {
displayBounds.push_back( SDL_Rect() );
SDL_GetDisplayBounds( i, &displayBounds.back() );
}
// window of dimensions 500 * 500 offset 100 pixels on secondary monitor
int x = displayBounds[ 1 ].x + 100;
int y = displayBounds[ 1 ].y + 100;
int w = 500;
int h = 500;
// so now x and y are on secondary display
SDL_Window * window = SDL_CreateWindow( "title", x, y, w, h, FLAGS... );
Run Code Online (Sandbox Code Playgroud)
综观的定义SDL_WINDOWPOS_CENTERED中SDL_video.h,我们看到它被定义为
#define SDL_WINDOWPOS_CENTERED SDL_WINDOWPOS_CENTERED_DISPLAY(0)
Run Code Online (Sandbox Code Playgroud)
所以我们也可以使用宏SDL_WINDOWPOS_CENTERED_DISPLAY( n )在哪里n显示索引.
Windows 10更新 - DPI扩展问题
似乎确实存在SDL2的错误并且在Windows中改变DPI规模(即文本规模).
以下是与问题相关的两个错误报告.他们仍然显然没有得到解决.
https://bugzilla.libsdl.org/show_bug.cgi?id=3433
https://bugzilla.libsdl.org/show_bug.cgi?id=2713
潜在解决方案
我确信OP可以使用WIN32 api来确定dpi比例,scale != 100%然后通过它来更正界限.
小智 0
是的,如果您知道第二个监视器的边界,则可以使用 SetWindowPosition。您可以使用函数 SDL_GetDisplayBounds(int displayIndex,SDL_Rect* rect) 来获取它们。