2012-10-06 184 views
6

好的,所以我們走吧。我試圖製作一個應用程序,使用XNA作爲基礎,因爲它的渲染器。這個項目需要的一件事是打開一個新窗口(作爲對話框),其中嵌入了一個單獨的XNA渲染面板。我將它用作交互式預覽面板,所以我絕對需要XNA來渲染它。不過,看來XNA並沒有很好的裝備來做到這一點。我自己嘗試了各種各樣的東西,但無濟於事(產生錯誤,無法正確渲染,或渲染錯誤的高寬比等)。通常情況下,我會在這裏發佈代碼,但由於我有這樣的小運氣,所以沒有太多要發佈。XNA與Windows窗體 - 打開新窗口

我的應用程序目前由一個嵌入在窗體中的XNA應用程序組成,並且我有一個打開預覽面板的按鈕,理論上它應該彈出爲包含XNA渲染器的窗體對話框,以允許我繪製預習。我一直在嘗試這幾個小時,並沒有得到任何好處,所以我在這裏尋求一些幫助。

謝謝,無論如何。

編輯:好的,我已經取得了一些進展,但我有2個問題。首先,任何使用Sprite批次繪製的紋理都會顯示正確的尺寸,但會填充純黑色。另外,當我打開對話框,然後關閉它並關閉應用程序時,出現AccessViolationException。我強烈懷疑這兩個錯誤以某種方式相關。

這是我的代碼初始化預覽對話框。 (a是一個基本上由Texture2D對象的LinkedList組成的自定義類)。

animPrev = new AnimationPreview(a); 
animPrev.Show(); 

我AnimationPreview類是Form類的延伸,幷包含一個PreviewControl對象,這是GraphicsDeviceControl的延伸的XNA的Winforms樣品中發現。請注意,由於各種原因,我的主要形式擴展了XNA Game類。

的PreviewControl對象設置是這樣的:

protected override void Initialize() 
{ 
    sb = new SpriteBatch(GraphicsDevice); 
    Application.Idle += delegate { Invalidate(); }; 
} 

而且Draw方法包括:

protected override void Draw() 
{ 
    GraphicsDevice.Clear(Microsoft.Xna.Framework.Graphics.Color.Violet); 
    if (frame != null) 
    { 
     sb.Begin(); 
     sb.Draw(Image, Vector2.Zero, Color.White); 
     sb.End(); 
    } 
} 

這將清除表單紫色的背景下,符合市場預期,並繪製一個黑盒子與Image相同的尺寸。這不是預期的。希望有人能幫助我。

注意:可接受的替代方法是將XNA Texture2D對象轉換爲System.Drawing.Image對象。但是,我使用XNA 3.1,因此我不能將紋理保存到流並重新加載。 事實上,在嘗試過之後,它有點狡猾,而且速度很慢,所以我寧願不這樣做。

+2

您是否使用[XNA WinForms示例](http://xbox.create.msdn.com/en-US/sample/winforms_series1)? (因爲,如果沒有,那將是第一步。) –

+0

不,我會看看它。 – Hoeloe

+0

嗯......這似乎幾乎是我正在尋找,但它有問題,它似乎並不包含更新循環。我目前的主要形式是一個Game類,把句柄轉換爲一個Form對象。我需要使用更新並在這個新窗口中繪製循環。 – Hoeloe

回答