1

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

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

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

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

启动计算线程。

最后,ComputationThread我向 GUI 线程发送一条消息以绘制数据,使用预定义的固定值和数据指针作为参数:

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

这也很好,我收到消息,我也可以将计算的数据写入文件,但是,在表单上绘图(例如 using SetPixel)没有效果,而当它不是时它有效果wParam例如 PARAM_FFT_COMPUTED当表单被调整大小。

InvalidateRect也没有效果。

我究竟做错了什么?

提前致谢!

4

1 回答 1

14

您不打算发送WM_PAINT. 这是一个特别合成的消息。您永远不会发布或发送它。相反,您调用InvalidateRect或相关函数之一来让系统生成WM_PAINT.

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

如果InvalidateRect不起作用,那么您的代码有一些根本性的问题。您需要解决这个问题,而不是尝试通过其他机制进行绘画。

因此,解决方案是使用InvalidateRect和修复WM_PAINT处理程序中的任何损坏。如果没有看到您的WM_PAINT处理程序,我不想推测出了什么问题。

于 2012-10-09T15:09:54.483 回答