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

Z0q*_*Z0q 5 c++ sdl window monitor sdl-2

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

UPDATE

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

在此输入图像描述

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_CENTEREDSDL_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%然后通过它来更正界限.

  • 对于 Win 10 缩放问题,请参阅这篇精彩的文章:https://nlguillemot.wordpress.com/2016/12/11/high-dpi-rendering/ 如果您使应用程序 dpi 感知(通过使用清单或 winapi 的 `SetProcessDpiAwareness`) `SDL_WINDOWPOS_CENTERED_DISPLAY` 就可以正常工作了!;) (2认同)

小智 0

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