gpt4 book ai didi

c# - 鼠标无法在 Winforms 中与 Monogame 一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 12:56:03 25 4
gpt4 key购买 nike

我已使用以下代码将 Monogame 嵌入到 Windows 窗体中:

    private IntPtr drawSurface;
private Control gameForm;

public MapEditor(MainWindow window)
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";

this.drawSurface = window.pcbViewport.Handle;
graphics.PreparingDeviceSettings += new EventHandler<PreparingDeviceSettingsEventArgs>(graphics_PreparingDeviceSettings);
Mouse.WindowHandle = drawSurface;
gameForm = Control.FromHandle(this.Window.Handle);
gameForm.VisibleChanged += new EventHandler(gameForm_VisibleChanged);
}

private void gameForm_VisibleChanged(object sender, EventArgs e)
{
if (gameForm.Visible)
{
gameForm.Visible = false;
}
}

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

现在,这段代码曾经有效……我想。已经有一段时间了,代码在另一台具有旧版本的计算机上,所以我似乎记得以前在 Monogame 上工作过。无论如何,问题是鼠标输入不起作用!键盘和游戏 handle 输入工作正常,但鼠标输入根本没有注册。我已经试验并发现,如果我取出 VisibleChanged 事件,它会起作用,但它还会显示 GameWindow 和表单(它不需要,因为它是在 PictureBox 中绘制的。

我知道我可以将 GameWindow 放在控件中,如果需要的话我会这样做,但我正在尝试查看是否有解决方案可以使现有代码再次运行。

最佳答案

您的方法的问题是设置 Mouse.WindowHandleMonoGame不执行任何操作(如果您使用 look at the source code,此属性的 setter 为空)。1

这意味着您的 Game始终绑定(bind)到其默认窗口(您隐藏的窗口),并且该窗口之外的所有鼠标输入都将被忽略。如果不隐藏它,您会看到单击原始窗口会正确创建鼠标事件。另一方面,对图片框的绘制是正确的。键盘事件不会按屏幕区域过滤,因此它们可以正常工作。

我的观点是,这不是在 Windows 窗体中托管 XNA/MonoGame 的方式,而是研究如何实现 GraphicsDeviceControl类,应继承自 System.Windows.Forms.Control并提供使用 XNA 框架绘制自身的能力 GraphicsDevice . this article 中解释了该方法(XNA 4,但可以轻松移植到 MonoGame)。

如果您确实想使用您现在正在使用的方法,您可以做的唯一事情就是检查 MonoGame 源代码,并找到 GameWindow 的实现。对于 Windows 窗体(即 WinFormsGameWindow ,这是一个内部类)。自 Mouse.GetState()仅返回 GameWindow.MouseState ,实例化您自己的可能性 GameWindow将允许您通过您的窗口过滤事件。

或者,如果您无论如何都要更改 MonoGame 代码,那么您不妨添加一个 Game接受 Control 的构造函数重载从头开始处理。


1 具有讽刺意味的是,里面有一条评论说这个 setter 被保留“只是为了 XNA 兼容性”,就像抛出一个编译时错误与人们将失去调试它的时间相比是一个大问题。 :-D

关于c# - 鼠标无法在 Winforms 中与 Monogame 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com