1

我正在使用 Monogame 为 Windows 8 应用商店编写 XNA 游戏。我还在使用连接到外接显示器的笔记本电脑。自然,我的外接显示器的分辨率比我笔记本电脑的屏幕高得多。当我将应用程序从一个屏幕拖到另一个屏幕时,视口上的分辨率会发生变化。

在我的构造函数中,我正在使用

 _graphics = new GraphicsDeviceManager(this);
 _graphics.PreferredBackBufferHeight = 768;
 _graphics.PreferredBackBufferWidth = 1366;

设置我的视口分辨率。当应用程序在任一监视器上运行时,这使得应用程序可以正常工作,但是将应用程序从一个监视器拖到另一个监视器会更改 GraphicsDeviceManager 上的分辨率。有没有办法阻止这种变化?

4

2 回答 2

1

我得到与原始海报相同的东西,但使用 XNA,而不是 MonoGame。当我在两个监视器之间拖动窗口时,分辨率会发生变化,但不会(当然)触发 ClientSizeChanged 事件。上面使用 SizeChanged 事件的建议很有帮助,但文档说仅适用于 Windows8。

我似乎通过处理 Window.ScreenDeviceNameChanged 事件来修复它——我将它连接到与 ClientSizeChanged 相同的处理程序。

我会将此作为对原始帖子的评论,但我没有足够的“声誉”点让系统让我这样做。

于 2014-01-06T20:13:36.900 回答
1

所以我想通了

首先我写了一个方法来检查图形设备上的端口分辨率是否改变了

 private bool hasResolutionChanegd()
    {
        if ((GraphicsDevice.Viewport.Width != ScreenManager.Instance.ScreenWidth) || (GraphicsDevice.Viewport.Height != ScreenManager.Instance.ScreenHeight))
        {
            return true;
        }
        else
        {
           return false;
        }

    }

我在每次更新时调用此方法

if (hasResolutionChanegd())
        {
             Debug.WriteLine("Resolution Change new width= " + GraphicsDevice.Viewport.Width +" new height="+ GraphicsDevice.Viewport.Height);

            _graphics.PreferredBackBufferHeight = 768;
            _graphics.PreferredBackBufferWidth = 1366;
            _graphics.ApplyChanges();
        }

这样,每当图形设备管理器上的分辨率发生变化时(当用户将应用程序从一个屏幕环境拖到另一个屏幕环境时),就会强制执行首选分辨率。

于 2013-01-31T21:35:20.290 回答