使用Windows窗体和OpenGl-C的事件消息#

使用Windows窗体和OpenGl-C的事件消息#,windows,forms,events,opengl,Windows,Forms,Events,Opengl,我只是想知道这是否是一种正常的行为,是否有什么可以阻止它 我在Windows窗体上使用OpenGL和TaoClassic(可能与此问题无关,但很好)。 现在,我有一个非常基本的正方形,它在窗口周围移动,当到达窗口边缘时,速度是倒转的(x为左/右,y为上/下) 到目前为止没有什么特别的 当对象移动时,如果我单击窗体的边框,那么应用程序将停止,新图形不会出现,但应用程序会部分更新。我之所以这么说,部分是因为从下面的代码来看,前两行代码继续运行,而“冲突”检测则没有 transform

我只是想知道这是否是一种正常的行为,是否有什么可以阻止它

我在Windows窗体上使用OpenGL和TaoClassic(可能与此问题无关,但很好)。 现在,我有一个非常基本的正方形,它在窗口周围移动,当到达窗口边缘时,速度是倒转的(x为左/右,y为上/下)

到目前为止没有什么特别的

当对象移动时,如果我单击窗体的边框,那么应用程序将停止,新图形不会出现,但应用程序会部分更新。我之所以这么说,部分是因为从下面的代码来看,前两行代码继续运行,而“冲突”检测则没有

        transform.position.x +=  velocity.x * xSign * Time.deltaTime;
        transform.position.y +=  velocity.y * ySign * Time.deltaTime;
        if (penguin.transform.position.x + penguin.sprite.texture.width / 2f > Engine.Screen.Width ||
            penguin.transform.position.x - penguin.sprite.texture.width / 2f < 0) xSign *= -1;
        if (penguin.transform.position.y + penguin.sprite.texture.height / 2f > Engine.Screen.Height ||
            penguin.transform.position.y - penguin.sprite.texture.height / 2f < 0) ySign *= -1;
下面是应用程序的消息:

 private void OnApplicationEnterIdle(object sender, EventArgs e)
 {
     Message msg;
     while (!PeekMessage(out msg, IntPtr.Zero, 0, 0, 0))
     {
            _timer.SetTime();
            Input.Update();
            _callback();    
     }
 }
我想问题就在其中一个。Update和Draw方法是从_callback()调用的;方法

仅供参考,当单击表单时,它不会停止应用程序,因此它必须处理基于单击边框的事件


有什么想法吗?

这是正常的行为。移动和调整事件大小是阻塞的(这是默认WndProc的工作方式),并且不会调用OnApplicationEntriedle


AFAIK在调整窗口大小时继续更新的唯一方法是使用不同的线程进行渲染。在这种情况下,只有主线程将阻止移动并调整事件大小,而渲染线程将继续更新视口。

我的想法是停止更新,而不是继续更新。延续是问题所在,也是为什么只考虑前两行。如果要停止更新,只需在移动/调整大小事件后重置Time.deltaTime。查看代码,我猜_timer.SetTime();将重置deltaTime。
 private void OnApplicationEnterIdle(object sender, EventArgs e)
 {
     Message msg;
     while (!PeekMessage(out msg, IntPtr.Zero, 0, 0, 0))
     {
            _timer.SetTime();
            Input.Update();
            _callback();    
     }
 }