繁体   English   中英

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

[英]C++ Win32: Calling WM_PAINT from another thread using SendMessage, drawing has no effect

我目前正在开发一个程序(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 ,则有效调整表格大小时。

InvalidateRectInvalidateRect

我究竟做错了什么?

提前致谢!

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

并且您无意在WM_PAINT消息处理程序之外的窗口上绘制。 或来自GUI线程以外的其他线程。 也许您没有做任何这些事情,但是它们是常见的错误,因此提起来也没有什么害处。

如果InvalidateRect无法正常工作,则您的代码存在一些根本问题。 您需要解决此问题,而不是尝试通过其他某种机制使绘画工作。

因此,解决方案是使用InvalidateRect并修复WM_PAINT处理程序中损坏的所有内容。 在没有看到您的WM_PAINT处理程序的情况下,我不想推测出什么错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM