我正在使用SDL_SetWindowPosition
来定位我的窗口。我可以使用此功能将窗口放在另一台显示器上吗?SDL2如何在第二台显示器上放置窗口?
UPDATE
使用SDL_GetDisplayBounds
当文本大小在Windows 10改变任何想法如何解决这个问题将不会返回正确的监视器位置?
我正在使用SDL_SetWindowPosition
来定位我的窗口。我可以使用此功能将窗口放在另一台显示器上吗?SDL2如何在第二台显示器上放置窗口?
UPDATE
使用SDL_GetDisplayBounds
当文本大小在Windows 10改变任何想法如何解决这个问题将不会返回正确的监视器位置?
是的,你可以使用SetWindowPosition,如果你知道第二个监视器的边界。 您可以使用函数SDL_GetDisplayBounds(int displayIndex,SDL_Rect * rect)来获取它们。
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%
,然后纠正的范围。
我想评论一下原始问题来回答你的问题,但我还没有特权。我的猜测是更改Windows 10中的**文本比例**,以某种方式影响与SDL的屏幕坐标。 我有一个不同的但相关的问题,直到我想通过我的Mac的Retina显示器来使用SDL2。 (视网膜使用缩放)。 我建议您尝试以下实验:在Windows 10下输出显示范围,并检查它们是否更改,当您更改文本比例设置。 –
它可能是SDL2的一个错误。您是否在Windows 10上搜索了具有相同体验的其他人? –
如果我的假设是正确的,由于125%的文字比例,所有屏幕位置将乘以1.25。 –