Windows 8应用程序XNA在两个不同分辨率的显示器上

时间:2013-01-31 21:14:33

标签: c# windows-8 xna monogame

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

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

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

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

2 个答案:

答案 0 :(得分: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();
        }

这样,每次在图形设备管理器上更改分辨率时(当用户将应用程序从一个屏幕环境拖动到另一个屏幕环境时),都会强制执行首选解决方案。

答案 1 :(得分:1)

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

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

我会把它作为对原帖的评论,但我没有足够的“声誉”点让系统让我。