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... );
查看 SDL_video.h
中 SDL_WINDOWPOS_CENTERED
的定义,我们可以看到它被定义为
#define SDL_WINDOWPOS_CENTERED SDL_WINDOWPOS_CENTERED_DISPLAY(0)
因此,我们也可以使用宏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%
,然后通过它来纠正边界。
SetProcessDpiAwareness
),SDL_WINDOWPOS_CENTERED_DISPLAY
将正常工作!;) - pergyDPI缩放问题(“在更改文本大小时将不返回正确的监视器位置”)
这是SDL2已知的问题(我在这些版本中遇到过:2.0.6、2.0.7、2.0.8,可能旧版本也存在此问题)。
解决方案:
1)使用清单文件并在其中设置:
<dpiAware>True/PM</dpiAware>
你需要将清单文件包含到应用程序分发中。
2)尝试使用SetProcessDPIAware()。
是的,如果您知道第二个显示器的边界,您可以使用SetWindowPosition函数。 您可以使用函数SDL_GetDisplayBounds(int displayIndex,SDL_Rect* rect)来获取它们。