【问题标题】:MonoGame Maximize window eventMonoGame 最大化窗口事件
【发布时间】:2017-07-28 00:21:25
【问题描述】:

我在尝试使用 monogame 和 c# 实现事件时遇到了麻烦。目前,当我调整窗口大小时,我会调用一个事件:

        this.Window.ClientSizeChanged += new EventHandler<EventArgs>(Window_ClientSizeChanged);

        void Window_ClientSizeChanged(object sender, EventArgs e)
        {
            int width = Window.ClientBounds.Width;
            int height = Window.ClientBounds.Height;
            if (width > 0 && height > 0)
            {
                graphics.PreferredBackBufferWidth = width;
                graphics.PreferredBackBufferHeight = height;
                graphics.ApplyChanges();
             }
        }

这一切都很好,可以正确调整我的窗口大小并更新宽度/高度。但是,如果用户通过单击窗口框架上的最大化/最小化按钮来调整我的窗口大小,则不会触发它。

在花了一些时间研究一些解决方案之后,实现最大化事件的唯一建议来自here

Form form = (Form)Control.FromHandle(Window.Handle);
form.WindowState = FormWindowState.Maximized;

然而,这是一个我不是特别喜欢的解决方案,因为它依赖于 System.Windows.Forms 的包含,而且我可能有一天想为其他平台构建 id 而不是包含任何特定的窗口库。

是否有任何单一游戏功能可以处理每个平台的最大化/最小化事件调用,还是由最终用户来实现此类功能?

【问题讨论】:

标签: c# mono xna monogame


【解决方案1】:

我也遇到过这个问题,但在 MonoGame API 中没有找到任何“内置”解决方案。

我想出的解决方案是在每一帧开始时检查Window.ClientBounds 的宽度和高度是否发生了变化。
它检测与Window.ClientSizeChanged 事件类似的所有窗口大小调整,但也检测通过最大化/恢复窗口进行的调整大小。

【讨论】:

  • 您的回答和评论都是正确的,但是我选择实施您的建议,因为如果代码库发生变化,它似乎更容易修改。但是,如果您想重新创建特定的分辨率和窗口状态(最大化或最小化),那么无论哪种方式,您都需要使用 winforms ......令人讨厌......因为这似乎是确保其正确大小 + 最大化的唯一方法。无论哪种方式都是一个有用的解决方案!谢谢
  • 请注意,当客户端最小化时,您的 ClientBounds 将为 (0, 0, 0, 0),因此如果您检查每个更新,请考虑到这一点。
  • @Acidic,几乎和你做的一模一样。唯一的区别是我使用了更新并引入了延迟,所以检查是每秒两次。不确定您的用例是什么,但对我来说,我必须更改一些显示比例才能正确重新调整我的内容。不需要这个检查那么快。感谢您的帖子,我在敲了一下头并已经解决它之后找到了它,但这是一个很好的确认。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
相关资源
最近更新 更多