2

我正在尝试在 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.Height261,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 知识,这很难调试。

有没有人看到我做错了什么?

4

2 回答 2

3

弄清楚了!

在我构建演示参数时,我需要添加IsFullScreen = false.

如果它给出了一个很好的异常消息会更容易弄清楚

于 2013-01-30T00:50:16.463 回答
1

尝试使用OnHandleCreated而不是OnCreateControl

protected override void OnHandleCreated()
{
    if (!DesignMode)
        _renderer = new XnaRenderer(Handle, ClientSize.Width, ClientSize.Height);

    base.OnHandleCreated ();
}

如果它不起作用,请尝试使用HiDef配置文件而不是Reach配置文件。

否则,我看不出有什么不对。

于 2013-01-30T00:42:24.180 回答