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

Daw*_*aha 1 c++ winapi visual-c++

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

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

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

boost::thread t(&ComputationThread,data);
Run Code Online (Sandbox Code Playgroud)

启动计算线程.

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

SendMessage(hWnd, WM_PAINT, PARAM_FFT_COMPUTED, (LPARAM)data);
Run Code Online (Sandbox Code Playgroud)

这工作得很好,以及,我得到的消息,我也可以计算的数据写入文件,然而,绘制表格上(例如,使用SetPixel)没有任何影响,而它的效果时,wParam不是 PARAM_FFT_COMPUTED,例如当表单调整大小.

InvalidateRect也没有效果.

我究竟做错了什么?

提前致谢!

Dav*_*nan 13

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

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

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

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