当前位置: 首页 > 知识库问答 >
问题:

Win32消息超时清除我的窗口

荀辰钊
2023-03-14

采用具有窗口和消息循环的最简单的 Windows 程序,例如 Hello, World 程序。

假设就在我进入消息循环之前,我画进了窗口(在wm_paint处理之外顽皮地做了,但请耐心等待)。

如果在开始消息循环之前,我花了超过5秒的时间做这件事,或者我画了一些东西,然后花了5秒做其他事情,那么消息系统似乎“超时”。PeekMessage的MSDN文档称它变得“无响应”,并将其变成“幽灵”窗口。

然而,我的问题是它也会清除窗口的内容!

有没有办法阻止它这样做?如果我花太长时间在窗口中绘图,即使是在官方wm_paint处理期间,也会显示同样的“无响应”标题;它还会通过生成更多wm_paint消息开始表现奇怪。

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

共有2个答案

纪畅
2023-03-14

创建一个用于在缓存位图上进行广泛绘制的线程。当位图还没有准备好时,只需在WM_PAIN事件“处理请等待...”上打印即可。当准备好打印该位图时。并销毁线程。

卫宁
2023-03-14

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

如果您必须进行大量处理,那么要么定期检查消息,要么在单独的线程中完成工作。

 类似资料:
  • 问题内容: 有没有办法清除给定窗口中的所有超时?我认为超时存储在对象中的某个位置,但无法确认。 任何跨浏览器解决方案都是受欢迎的。 问题答案: 它们不在window对象中,但是具有id,这些id是连续的整数。 因此,您可以像这样清除所有超时:

  • 我们设置了几个ActiveMQ Artemis 2.17.0集群,以便在数据中心之间使用镜像进行复制。 在ActiveMQ Artemis 2.17.0或更高版本中有什么方法可以实现这一点吗?

  • 问题内容: 我有一个Java程序,其中包含一个从JFrame继承的 Application 类。 我想显示一条消息,询问用户单击窗口右上方的X按钮是否要退出程序。 到目前为止,这是我的代码: 我从网上找到的教程中获得了此代码。我自己编写了WindowClosing事件处理程序的代码。但是,我在注册窗口侦听器(addWindowListener)时遇到麻烦。它告诉我WindowAdapter是抽象的

  • 我有一个Java程序,其中包含一个从JFrame继承的类Application。 我想显示一条消息,询问用户单击窗口右上角的X按钮是否要退出程序。 这是我目前的代码: 我从网上找到的教程中得到了这段代码。我自己编写了WindowClosing事件处理程序。但是,我在注册窗口侦听器(addWindowListener)时遇到问题。它告诉我WindowAdapter是抽象的,不能实例化。 请问我怎样才

  • 我们使用的是Apache Cassandra 3.11.4。最近,我们在整个集群中看到过载的readrepair错误消息,因为我们超时了..我找不到这个问题的根本原因。感谢任何关于这个问题的投入.. 错误 [读取修复阶段:2537] 2019-07-18 17:08:15,119 卡桑德拉守护进程.java:228 - 线程中的异常[读取修复阶段:2537,5,main] 组织.apache.ca

  • 在前两章,程序使用了同一个函数MessageBox来向使用者输出文字。MessageBox函数会建立一个「窗口」。在Windows中,「窗口」一词有确切的含义。一个窗口就是屏幕上的一个矩形区域,它接收使用者的输入并以文字或图形的格式显示输出内容。 MessageBox函数建立一个窗口,但这只是一个功能有限的特殊窗口。消息窗口有一个带关闭按钮的标题列、一个选项图标、一行或多行文字,以及最多四个按钮。