C ++ Win32:使用SendMessage从另一个线程调用WM_PAINT,绘图无效

时间:2012-10-09 15:04:20

标签: c++ winapi visual-c++

我目前正在开发一个程序(C ++ Win32,Visual Studio 2012),它捕获来自麦克风的音频信号,计算另一个线程中的傅里叶变换(你知道,获取音频中的频率),最后绘制结果在屏幕上。

除了绘图外,一切正常,所以这是一个与GUI相关的主题。

在WndProc中,当缓冲区已满并准备好处理时,我收到一条消息,然后我调用

boost::thread t(&ComputationThread,data);

启动计算线程。

ComputationThread结束时,我向GUI线程发送消息,使用预定义的固定值和数据指针作为参数绘制数据:

SendMessage(hWnd, WM_PAINT, PARAM_FFT_COMPUTED, (LPARAM)data);

这也可以正常工作,我收到消息,我也可以将计算数据写入文件,但是,在表单上绘图(例如使用SetPixel)没有效果,而当它有效时wParam PARAM_FFT_COMPUTED,例如在调整表单大小时。

InvalidateRect也没有效果。

我做错了什么?

提前致谢!

1 个答案:

答案 0 :(得分:13)

您无意发送WM_PAINT。这是一个特别合成的消息。你永远不会发布或发送它。而是调用InvalidateRect或其中一个相关函数来让系统生成WM_PAINT

并且您不打算在WM_PAINT消息处理程序之外的窗口上绘图。或者从GUI线程以外的线程。也许你没有做任何这些事情,但它们是常见的错误,因此提及它并没有什么坏处。

如果InvalidateRect不起作用,那么您的代码就会出现根本问题。你需要解决这个问题,而不是试图通过其他机制使绘画工作。

因此,解决方案是使用InvalidateRect并修复WM_PAINT处理程序中的任何内容。没有看到你的WM_PAINT处理程序,我不想推测出错是什么。