2013-01-31 25 views
1

我正在使用Monogame爲Windows 8應用商店編寫XNA遊戲。我還使用連接到外部顯示器的筆記本電腦。當然,我的外接顯示器上的分辨率遠遠高於筆記本電腦的屏幕。當我將應用程序從一個屏幕拖動到另一個屏幕時,視圖端口上的分辨率發生變化。在不同分辨率的兩臺顯示器上的Windows 8應用XNA

在我的構造函數中我使用

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

要設置我的視口的分辨率。這使應用程序在任何監視器上運行時都能正常工作,但是將應用程序從一個監視器拖動到另一個監視器會更改GraphicsDeviceManager上的分辨率。無論如何阻止這種變化?

+0

你是什麼意思,分辨率變化?它增加了嗎,還是隻是窗口大小發生了變化? – Nolonar

+0

我正在使用1600x900分辨率的筆記本電腦和外置FullHD顯示器測試我的舊XNA應用程序之一。我在拖動窗口,但分辨率不會改變,只是窗口的(物理)大小,這是由於屏幕分辨率的差異。我可以給你的唯一真正的答案是,也許Monogame有一個錯誤,因爲它仍然處於測試階段,並沒有真正使用MS代碼(甚至沒有反向工程)。雖然我不會在這方面下注。 – Nolonar

回答

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(); 
     } 

通過這種方式,每次圖形設備管理器上的分辨率發生變化時(用戶將應用程序從一個屏幕環境拖動到另一個屏幕環境時),首選解析CED。

+3

而不是檢查每個更新上的視口大小更改,您可能想要偵聽CoreWindow的SizeChanged事件http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.core.corewindow.sizechanged。 ASPX – Denis

1

我得到了與原始海報相同的東西,但使用XNA而不是MonoGame。當我在兩臺顯示器之間拖動窗口時,分辨率會發生變化,但ClientSizeChanged事件不會(當然)觸發。上述使用SizeChanged事件的建議是有幫助的,但僅適用於文檔中提到的Windows8。

我似乎已通過處理Window.ScreenDeviceNameChanged事件修復了它 - 我將它連接到與ClientSizeChanged相同的處理程序。

我會把它作爲對原始帖子的評論,但我沒有足夠的「聲望」點讓系統讓我。