诊断神秘 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 消息的主要内容,如果未能解决你的问题,请参考以下文章

为 HRESULT 代码生成诊断消息?

DCM之诊断服务调度程序(DSD)详解一

编译时如何更改 makefile 诊断消息 [GNU ARM GCC, Eclipse make.exe]

如何在 gcc4.9 中设置 GCC_COLORS 以发出着色诊断消息?

使用 SCons 着色编译器诊断

抑制肯定响应消息指示位(SPRMIB)