如何在MonoGame中获取基础窗口?

时间:2012-10-15 20:06:01

标签: xna opentk monogame

我正在将 Gleed2D 从XNA转换为MonoGame。

Gleed2D是一个 Windows窗体应用程序,用于实例化XnaGame。然后隐藏window创建的Game,并将DeviceWindowHandle设置为主表单上Canvas的{​​{1}}。

我知道这有点拗口;代码说不出话来:here it is in full 相关位在构造函数中:

            _drawSurface = mainForm.GetHandleToCanvas();
            _graphics = new GraphicsDeviceManager( this )
            {
                PreferredBackBufferWidth = 800,
                PreferredBackBufferHeight = 600
            } ;

        _graphics.PreparingDeviceSettings += graphics_PreparingDeviceSettings;

        _winform = (Form)Form.FromHandle(Window.Handle);

        _winform.VisibleChanged += game1VisibleChanged;
        _winform.Size = new Size(10, 10);

        Mouse.WindowHandle = _drawSurface;

        Size pictureBoxSize = _mainForm.CanvasSize ;

        ResizeBackBuffer( pictureBoxSize.Width, pictureBoxSize.Height ) ;

                    ... some other stuff....


    void graphics_PreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e)
    {
        e.GraphicsDeviceInformation.PresentationParameters.DeviceWindowHandle = _drawSurface;
    }

我的问题是:在XNA中,Window.Handle可以转换为Form。在MonoGame中,它被实现为OpenTK.GameWindow如何进入实际窗口以便隐藏和/或调整大小?。另一个问题是:如何创建MonoGame Game并告诉它渲染表面是另一个控件的表面?

2 个答案:

答案 0 :(得分:1)

在创建原生窗口之前,OpenTK的GameWindow还有很长的路要走。在此页面上,您可以看到本机实现:https://github.com/mono/opentk/blob/master/Source/OpenTK/Platform/Windows/WinGLNative.cs

我的解决方案是破解OpenTK的源代码或在OpenTK论坛中提问。

答案 1 :(得分:1)

不确定这是否有帮助但是在MonoGame游戏构造函数中它将GraphicsDeviceManager初始化为一个名为_graphics的变量。哪个对象可以获得当前的GraphicsDevice Manager,它有一个名为SetRenderTarget和SetRenderTargets的方法。你可以通过这个获取Handle到游戏窗口.Window.Handle“this”是当前的游戏对象。此外,在Graphics设备中有一个Present方法,您可以传递源和目标Rectangle以及任何Windows句柄。 祝你好运。