Winapi Win32消息超时清除我的窗口

Winapi Win32消息超时清除我的窗口,winapi,win32gui,Winapi,Win32gui,以最简单的Windows程序为例,使用窗口和消息循环,例如Hello,World程序 假设在我进入消息循环之前,我画进了窗口(在wm_paint处理之外顽皮地做了,但请容忍我) 如果在开始消息循环之前,我花了大约5秒钟做这件事,或者我画了一些东西,然后又花了5秒钟做了其他事情,那么消息系统似乎“超时”。MSDN docs for PeekMessage说它变得“无响应”,并将其变成“重影”窗口 但我的问题是,它也会清除窗口的内容 有没有办法阻止它那样做?如果我花太长时间在窗口中画画,即使是在官方

以最简单的Windows程序为例,使用窗口和消息循环,例如Hello,World程序

假设在我进入消息循环之前,我画进了窗口(在wm_paint处理之外顽皮地做了,但请容忍我)

如果在开始消息循环之前,我花了大约5秒钟做这件事,或者我画了一些东西,然后又花了5秒钟做了其他事情,那么消息系统似乎“超时”。MSDN docs for PeekMessage说它变得“无响应”,并将其变成“重影”窗口

但我的问题是,它也会清除窗口的内容

有没有办法阻止它那样做?如果我花太长时间在窗口中画画,即使是在官方的wm_绘制过程中,也会显示相同的“无响应”标题;它还开始通过生成更多的wm_paint消息来表现异常


如果所有事情(如复杂的渲染或图像处理)都必须在5秒内完成,或者任何算法需要不断刺激消息队列以停止超时,那么这似乎是非常有限制的

这是设计的。您必须不断检查消息,以便能够响应用户事件,如调整窗口大小或关闭窗口。更糟糕的是,如果您的应用程序没有响应事件,那么这可能会导致其他应用程序冻结,因为它们可能会向您的应用程序发送消息并等待答复


如果必须进行大量处理,则可以定期检查消息,或者在单独的线程中执行此工作。

创建一个线程,用于在缓存位图上进行扩展绘制。当位图还没有准备好时,只需打印WM_PAIN事件“正在处理,请稍候…”即可。准备好后打印位图。并销毁线程。

如果您想要响应用户界面,则需要及时响应消息。除了逻辑上的必要性之外,我看不到太多的限制。您对
WM_PAINT
消息的观察也不正确:消息队列中不会有多条
WM_PAINT
消息。事实上,队列中甚至没有一条
WM_PAINT
消息;如果无效区域为非空,并且消息队列中没有任何更高优先级的消息,则会由消息检索函数生成。重影功能在MSDN上有说明:。可以使用OK禁用它,但上下文如下:我正在创建一个简单的图形库,供不想知道消息超时或重新绘制的简单解释语言使用。它把一些东西放在屏幕上,并期望它留在那里!绕开这段时间会让事情变得尴尬和/或拖慢。而且我无法阻止用户代码调用一个可能需要5秒以上才能完成的外部进程,此时消息系统处于恐慌状态。也许我需要开始研究线程,但我以前从未使用过线程。你不能指望屏幕上的东西会一直存在,它会在你无法控制的各种情况下被删除。您应该做的是:1)将您的语言放在自己的线程中,并将其绘制到内存设备上下文(DC)。2) 在主线程中,在WM_PAINT上,您只需将内存DC复制到屏幕。您需要使用一个关键部分来确保两个线程不会同时写入DC。我可以让我的解释器每秒左右调用一次PeekMessage来解决这个问题(这是一个麻烦,因为它必须在字节码级别处理;它可能会影响性能)。但是,当程序调用它等待的另一个长进程(例如system())时,它将不起作用。有没有办法暂停消息系统一段时间?@bartc:如果您的解释器/语言运行时在GUI线程上运行,您应该重新审视您的设计。将计算卸载到工作线程,并在必要时通知GUI线程。这就是几乎所有具有图形用户界面的应用程序的实现方式,与平台无关。