SDL2如何在第二台显示器上定位窗口?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDL2如何在第二台显示器上定位窗口?相关的知识,希望对你有一定的参考价值。
我正在使用SDL_SetWindowPosition
来定位我的窗户。我可以使用此功能将窗口定位在另一台显示器上吗?
UPDATE
在Windows 10中更改文本大小时,使用SDL_GetDisplayBounds
将无法返回正确的监视器位置。任何想法如何解决此问题?
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_CENTERED
中SDL_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来确定qpixswpoi的dpi比例,然后通过它来纠正界限。
是的,如果您知道第二台显示器的边界,则可以使用SetWindowPosition。您可以使用函数SDL_GetDisplayBounds(int displayIndex,SDL_Rect * rect)来获取它们。
DPI缩放问题(“更改文本大小时不会返回正确的监视器位置”)
这是SDL2的一个已知问题(我在那些版本中遇到过它:2.0.6,2.0.7,2.0.8,可能旧版本也有这个问题)。
解决方案:
1)使用清单文件并在那里设置:
scale != 100%
(您需要将清单文件包含在您的应用程序分发中)
2)尝试SetProcessDPIAware()。
以上是关于SDL2如何在第二台显示器上定位窗口?的主要内容,如果未能解决你的问题,请参考以下文章
如何确定我的 .NET Windows Forms 程序在哪个监视器上运行?