【发布时间】:2012-09-27 16:33:02
【问题描述】:
好的,我们开始吧。我正在尝试制作一个应用程序,使用 XNA 作为基础,因为它的渲染器。在这个项目中需要做的一件事是打开一个新窗口(作为一个对话框),其中嵌入了一个单独的 XNA 渲染面板。我将它用作交互式预览面板,所以我绝对需要 XNA 在那里渲染。然而,似乎 XNA 并没有很好地做到这一点。我自己尝试了各种方法,但无济于事(产生错误且未正确渲染,或以错误的纵横比渲染等)。通常,我会在这里发布代码,但由于我运气不佳,所以没有太多可发布的内容。
我的应用程序当前包含一个嵌入在表单中的 XNA 应用程序,并且我有一个打开预览面板的按钮,理论上它应该作为一个包含 XNA 渲染器的表单对话框弹出,以允许我绘制预览.我已经尝试了几个小时,但无济于事,所以我在这里寻求一些帮助。
无论如何,谢谢。
编辑:好的,我取得了一些进展,但我有 2 个问题。首先,使用精灵批次绘制的任何纹理都显示正确的尺寸,但填充为纯黑色。此外,当我打开对话框,然后关闭它并关闭应用程序时,我得到一个 AccessViolationException。我强烈怀疑这两个错误以某种方式联系在一起。
这是我初始化预览对话框的代码。 (a 是一个自定义类,本质上由 Texture2D 对象的 LinkedList 组成。
animPrev = new AnimationPreview(a);
animPrev.Show();
我的 AnimationPreview 类是 Form 类的扩展,并且包含一个 PreviewControl 对象,它是 XNA Winforms 示例中的 GraphicsDeviceControl 的扩展。请注意,出于各种原因,我的主窗体扩展了 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,所以我不能只将纹理保存到流中并重新加载它。 其实试过之后,有点狡猾,而且很慢,所以我宁愿不这样做。
【问题讨论】:
-
您使用的是XNA WinForms Sample吗? (因为,如果不是,那将是第 1 步。)
-
不,我去看看。
-
嗯......这似乎几乎是我正在寻找的,但它的问题是它似乎不包含更新循环。我目前的主要形式是一个 Game 类,句柄转换为 Form 对象。我需要在这个新窗口中使用更新和绘制循环。
-
好吧...它似乎也只允许创建一种尺寸的图形设备,这对我来说是个问题。我会进一步研究。
-
等等!我想我明白了。我使用此 GraphicsDeviceControl 创建了一个“PreviewControl”,然后将其嵌入到预览 Winform 中。似乎工作......
标签: c# winforms dialog xna panel