如何在多台显示器上正确切换全屏无边框
How to toggle fullscreen borderless on multiple monitors properly
我一直在寻找一种方法来根据 window 在全屏显示之前的位置正确选择我想要全屏显示的显示器。
我在网上找了很久,但找不到任何东西,所以我最终尝试了很多东西,直到我找到了一些东西。
我想有人最终会尝试查找这个问题,我不妨分享我的解决方案。
我最后做的是使用 LWJGL2 的显示 class 获取 window 中心的虚拟屏幕坐标,如下所示:
int x = Display.getX() + Display.getWidth()/2,
y = Display.getY() + Display.getHeight()/2;
然后我使用 AWT 获取所有可用的监视器:
GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()
我遍历它们并获得它们的虚拟边界(并应用它们可能具有的任何 DPI 缩放):
Rectangle bounds = screenDevice.getDefaultConfiguration().getDefaultTransform().createTransformedShape(screenDevice.getDefaultConfiguration().getBounds()).getBounds();
编辑: 稍微修改了行,使其可以正确支持 Windows' DPI 缩放。
如果边界包含 window 的中心,这意味着大部分 window 可能在该监视器内:
if(bounds.contains(x,y))
return bounds; //getMonitorFromWindow()
然后在 windowed 无边框全屏和正常 windowed 之间切换 LibGDX 我做了以下操作:
// config is the LwjglApplicationConfiguration of the application
// upon changing using alt+enter
if(fullscreen) {
config.resizable = false;
Gdx.graphics.setUndecorated(true);
Rectangle monitor = getMonitorFromWindow();
// set to full screen in current monitor
Gdx.graphics.setWindowedMode(monitor.width, monitor.height);
Display.setLocation(monitor.x, monitor.y);
} else {
config.resizable = true;
Gdx.graphics.setUndecorated(false);
Rectangle monitor = getMonitorFromWindow();
// set to windowed centered in current monitor
Gdx.graphics.setWindowedMode((int) (monitor.width * 0.8f), (int) (monitor.height * 0.8f));
Display.setLocation(monitor.x + (int) (monitor.width * 0.1f), monitor.y + (int) (monitor.height * 0.1f));
}
我希望有人会觉得这有用。
我一直在寻找一种方法来根据 window 在全屏显示之前的位置正确选择我想要全屏显示的显示器。
我在网上找了很久,但找不到任何东西,所以我最终尝试了很多东西,直到我找到了一些东西。
我想有人最终会尝试查找这个问题,我不妨分享我的解决方案。
我最后做的是使用 LWJGL2 的显示 class 获取 window 中心的虚拟屏幕坐标,如下所示:
int x = Display.getX() + Display.getWidth()/2,
y = Display.getY() + Display.getHeight()/2;
然后我使用 AWT 获取所有可用的监视器:
GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()
我遍历它们并获得它们的虚拟边界(并应用它们可能具有的任何 DPI 缩放):
Rectangle bounds = screenDevice.getDefaultConfiguration().getDefaultTransform().createTransformedShape(screenDevice.getDefaultConfiguration().getBounds()).getBounds();
编辑: 稍微修改了行,使其可以正确支持 Windows' DPI 缩放。
如果边界包含 window 的中心,这意味着大部分 window 可能在该监视器内:
if(bounds.contains(x,y))
return bounds; //getMonitorFromWindow()
然后在 windowed 无边框全屏和正常 windowed 之间切换 LibGDX 我做了以下操作:
// config is the LwjglApplicationConfiguration of the application
// upon changing using alt+enter
if(fullscreen) {
config.resizable = false;
Gdx.graphics.setUndecorated(true);
Rectangle monitor = getMonitorFromWindow();
// set to full screen in current monitor
Gdx.graphics.setWindowedMode(monitor.width, monitor.height);
Display.setLocation(monitor.x, monitor.y);
} else {
config.resizable = true;
Gdx.graphics.setUndecorated(false);
Rectangle monitor = getMonitorFromWindow();
// set to windowed centered in current monitor
Gdx.graphics.setWindowedMode((int) (monitor.width * 0.8f), (int) (monitor.height * 0.8f));
Display.setLocation(monitor.x + (int) (monitor.width * 0.1f), monitor.y + (int) (monitor.height * 0.1f));
}
我希望有人会觉得这有用。