诊断神秘 WM_PAINT 消息
Posted
技术标签:
【中文标题】诊断神秘 WM_PAINT 消息【英文标题】:Diagnose mystery WM_PAINT message 【发布时间】:2016-01-15 12:47:02 【问题描述】:我有一条神秘的 WM_PAINT 消息无缘无故地发送到一个窗口,我无法理解。我正在使用我的一些代码发送一条 WM_PAINT 消息-
InvalidateRgn(graphwin_hwnd,NULL,1);
SendMessage(graphwin_hwnd,WM_PAINT,0,0);
但是在执行了在屏幕上绘制一些图形的后续代码之后,调试器指示第二条 WM_PAINT 消息从某个地方到达。我的问题是,如何诊断导致发送第二条 WM_PAINT 消息的原因。
编辑: i486 已正确指出我不需要显式执行 SendMessage()... 但令我惊讶的是,即使我将其注释掉,我仍然会得到 1 个多余的神秘的 WM_PAINT 消息被发送到我的图形窗口的处理程序,所以问题还没有完全解决。
编辑: 糟糕,我错了,在注释掉 SendMessage 之后,似乎我仍然有一个不相关的错误搞砸了事情 - 但我确实只收到一条 WM_PAINT 消息......所以问题解决了。
【问题讨论】:
您为什么决定自己发送WM_PAINT
?那总是错的。
我仍然收到 1 条多余的神秘 WM_PAINT 消息被发送到我的图形窗口的处理程序,所以问题还没有完全解决。 你应该会收到 WM_PAINT
消息.为什么您对收到它们感到惊讶?没有它们,您的窗户将如何粉刷?
@David,我希望收到一条 WM_PAINT 消息……但我收到了两条。绘制需要一段时间,因为它是一个包含超过 100,000 个点的散点图,我不想不必要地绘制两次。
@Mick 要解决这个问题,您可以在内存位图中绘制图像并从该位图重新绘制 WM_PAINT 上的窗口,而不是直接绘制 100,000 点。
除非您使用远程调试,否则不要假设调试器对被调试者是完全透明的。当您闯入调试器时,被调试者将失去前台激活,这通常会生成附加的WM_PAINT
消息。如果要进行本地调试,请确保使用跟踪点而不是断点。
【参考方案1】:
您不需要发送 WM_PAINT - 它会在无效后自动发送。致电UpdateWindow
强制执行。可能第二个 WM_PAINT 是因为InvalidateRgn
。要对此进行测试,请评论您的 SendMessage
并检查 WM_PAINT。
【讨论】:
谢谢你...但我似乎不止一只鸡!见编辑。 我希望额外的 WM_PAINT 是在初始重绘之后,即你在第一次显示窗口时得到一个正常的 WM_PAINT,其他来自InvalidateRgn
并且幻像消息是第 3 个?以上是关于诊断神秘 WM_PAINT 消息的主要内容,如果未能解决你的问题,请参考以下文章
编译时如何更改 makefile 诊断消息 [GNU ARM GCC, Eclipse make.exe]