2

最小限の XNA アプリケーションを Winforms MDI アプリケーションに埋め込もうとしていますが、問題が発生しているようです。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 に答える