我正在尝试在Winforms MDI应用程序中嵌入一个简单的XNA应用程序,我似乎遇到了问题。我跟随http://xbox.create.msdn.com/en-US/education/catalog/sample/winforms_series_1的例子,我不确定我做错了什么。
在我的MDI父级中,我通过以下方式实例化渲染表单:
private void MainForm_Load(object sender, EventArgs e)
{
var render = new RenderForm();
render.MdiParent = this;
render.Show();
}
我的渲染表单的代码是:
public class RenderForm : Form
{
private XnaRenderer _renderer;
protected override void OnCreateControl()
{
if (!DesignMode)
_renderer = new XnaRenderer(Handle, ClientSize.Width, ClientSize.Height);
base.OnCreateControl();
}
protected override void OnPaint(PaintEventArgs e)
{
_renderer.RenderScene(null);
}
}
因此,在创建表单时,它会尝试创建我的XnaRenderer
类的实例。 ClientSize.Width
为284,ClientSize.Height
为261,Handle
看起来有效。构造函数的代码是:
public XnaRenderer(IntPtr windowHandle, int width, int height)
{
_graphicsService = new GraphicsDeviceService(windowHandle, width, height);
SetViewport(width, height);
}
GraphicsDeviceService
类与示例代码中的类基本相同,但它不是单例。构造函数的代码是:
public GraphicsDeviceService(IntPtr windowHandle, int width, int height)
{
_presentationParams = new PresentationParameters
{
BackBufferFormat = SurfaceFormat.Color,
BackBufferHeight = Math.Max(height, 1),
BackBufferWidth = Math.Max(width, 1),
DepthStencilFormat = DepthFormat.Depth24,
DeviceWindowHandle = windowHandle,
PresentationInterval = PresentInterval.Immediate
};
_graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.Reach,
_presentationParams);
}
但是,当实例化GraphicsDevice
对象时,我得到以下InvalidOperationException
:
发生了意外错误。
没有更多的异常消息,也没有内部异常,如果没有很多XNA知识,这很难调试。
有人看到我做错了吗?
答案 0 :(得分:3)
想出来了!
在我的演示参数构建中,我需要添加IsFullScreen = false
。
如果它能给出一个好的异常消息,那就更容易理解了
答案 1 :(得分:1)
尝试使用OnHandleCreated
代替OnCreateControl
:
protected override void OnHandleCreated()
{
if (!DesignMode)
_renderer = new XnaRenderer(Handle, ClientSize.Width, ClientSize.Height);
base.OnHandleCreated ();
}
如果不起作用,请尝试使用HiDef
个人资料而不是Reach
个人资料。
否则,我没有看到任何错误。