SDL2如何在第二台显示器上定位窗口?

时间:2017-01-19 15:22:58

标签: c++ window sdl sdl-2 monitor

我正在使用SDL_SetWindowPosition定位我的窗口。我可以使用此功能将窗口定位在另一台显示器上吗?

更新

在Windows 10中更改文本大小时,使用SDL_GetDisplayBounds将无法返回正确的监视器位置。任何想法如何解决此问题?

enter image description here

3 个答案:

答案 0 :(得分:9)

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_WINDOWPOS_CENTEREDSDL_video.h的定义,我们看到它被定义为

#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来确定scale != 100%的dpi比例,然后用它来修正界限。

答案 1 :(得分:0)

是的,如果您知道第二台显示器的边界,则可以使用SetWindowPosition。 您可以使用函数SDL_GetDisplayBounds(int displayIndex,SDL_Rect * rect)来获取它们。

答案 2 :(得分:0)

DPI缩放问题(“更改文本大小时,不会返回正确的监视器位置”)

这是SDL2的一个已知问题(我在以下版本中遇到过:2.0.6、2.0.7、2.0.8,可能较旧的版本也有此问题)。

解决方案:

1)使用清单文件并在那里进行设置:

<dpiAware>True/PM</dpiAware>

(您需要将清单文件包括在您的应用分发版中)

2)尝试SetProcessDPIAware()。