3

我是 XNA 和 C# 的新手,在我的 XNA 项目中,我需要事件处理程序来预测游戏何时失去焦点,以便在再次获得焦点时同步音乐和视觉效果。但我遇到了一个问题;游戏在被拖动时不会“更新”,但我似乎找不到合适的事件监听器。我试过了:

System.Windows.Forms.Control.FromHandle(Window.Handle).Move += new EventHandler(DeactivateGame);

这个在移动窗口时调用了很多次“DeactivateGame”。但即使它有效,尽管它多次调用该函数,但我看不到在释放窗口句柄时调用函数的事件处理程序,以便游戏可以通过调用“ActivateGame”再次恢复

旁注(如果有帮助的话);

this.Activated += new EventHandler<EventArgs>(NotifyActivated);
this.Deactivated += new EventHandler<EventArgs>(NotifyDeactivated); 

这些事件处理程序在最小化窗口或将焦点放在游戏窗口以外的其他东西上时工作正常,但它不会注册被拖动的窗口。对于习惯编程的人来说可能很明显,但我只是想确保我已经提供了足够的信息

编辑:作为事件处理程序的结果,我要添加的函数是 DateTime/TimeSpan,当窗口失焦或被拖动时会调用它。当放下或再次获得焦点时,这会将当前时间与窗口失去焦点时设置的时间进行比较,以计算两者之间的损失时间。

4

1 回答 1

1

为了检测 XNA 窗口何时被拖动,您在正确的轨道上使用 Window.Handle 和 Windows 窗体。您可以简单地监听 ResizeBegin 和 ResizeEnd 事件来了解用户何时开始移动窗口以及何时释放它。

var xnaWinForm = (System.Windows.Forms.Control.FromHandle(Window.Handle) as System.Windows.Forms.Form);
if (xnaWinForm != null)
{
    xnaWinForm.ResizeBegin += new EventHandler(xnaWinForm_ResizeBegin);
    xnaWinForm.ResizeEnd += new EventHandler(xnaWinForm_ResizeEnd);
}

这就是事件处理程序的样子。

void xnaWinForm_ResizeBegin(object sender, EventArgs e)
{
    // XNA window is starting to be moved.
}

void xnaWinForm_ResizeEnd(object sender, EventArgs e)
{
    // XNA window was released and is no longer being moved.
}

然后只需将其与您提到的其他事件结合起来,以确定窗口何时最小化/恢复/活动,以确定窗口“非活动”多长时间。

于 2013-03-25T22:28:22.720 回答