C++ SDL2如何在第二个监视器上定位窗口?

C++ SDL2如何在第二个监视器上定位窗口?,c++,window,sdl,sdl-2,monitor,C++,Window,Sdl,Sdl 2,Monitor,我正在使用SDL\u SetWindowPosition定位我的窗口。我可以使用此功能将窗口定位到另一个监视器上吗 更新 在Windows 10中更改文本大小时,使用SDL\u GetDisplayBounds将不会返回正确的监视器位置。有没有办法解决这个问题 是的,如果您知道第二个监视器的边界,可以使用SetWindowPosition。 您可以使用函数SDL_GetDisplayBounds(int displayIndex,SDL_Rect*Rect)获取它们。SDL2使用全局屏幕空间坐标

我正在使用
SDL\u SetWindowPosition
定位我的窗口。我可以使用此功能将窗口定位到另一个监视器上吗

更新

在Windows 10中更改文本大小时,使用
SDL\u GetDisplayBounds
将不会返回正确的监视器位置。有没有办法解决这个问题


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

SDL2使用全局屏幕空间坐标系。每个显示设备在此坐标空间内都有自己的边界。以下示例将窗口放置在第二个显示设备上:

//枚举显示
int displays=SDL_GetNumVideoDisplays();
断言(显示>1);//假设我们有二级监视器
//获取所有显示的显示边界
向量displayBounds;
对于(int i=0;i
查看
SDL\u video.h
中的
SDL\u WINDOWPOS\u CENTERED
的定义,我们看到它被定义为

#定义SDL_WINDOWPOS_居中SDL_WINDOWPOS_居中显示(0)
因此,我们也可以使用宏
SDL\u WINDOWPOS\u CENTERED\u DISPLAY(n)
,其中
n
是显示索引

针对Windows 10的更新-DPI扩展问题

看起来SDL2确实存在一个bug,它改变了Windows中的DPI比例(即文本比例)

这里有两个与此问题相关的bug报告。这两个问题显然仍未解决

潜在解决方案


我确信OP可以使用WIN32 api来确定dpi比例,例如
scale!=100%
,然后以此更正边界。

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

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

解决方案:

1) 使用清单文件并将其设置为:

<dpiAware>True/PM</dpiAware>
True/PM
(您需要将清单文件包括到应用程序分发中)


2) 请尝试SetProcessDPIAware()。

我想对原始问题发表评论以回答您的问题,但我还没有这个特权。我猜在Windows10中更改文本比例会以某种方式影响SDL的屏幕坐标。我遇到了一个不同但相关的问题,直到我知道如何将SDL2与Mac的视网膜显示器结合使用。(视网膜使用缩放)。我建议您尝试以下实验:在Windows 10下,当您更改文本比例设置时,输出显示边界,并检查它们是否更改。这可能是SDL2的错误。您是否在Windows 10上搜索过其他具有相同体验的用户?如果我的假设是正确的,则所有屏幕位置将乘以1.25作为125%文本缩放的结果。有关Win 10缩放问题,请参阅这篇伟大的文章:如果您让您的应用程序dpi感知(通过使用清单或winapi的
SetProcessDPIaware
SDL_WINDOWPOS_CENTERED_显示将正常工作!)非常感谢你提出这个问题。我想知道为什么在我使用SDL时缩放是完全错误的,但事实证明这是因为Windows 125%的缩放。为我节省了数小时的调试时间。