![](/img/trans.png)
[英]Win32 C++ Subclassed label not receiving WM_PAINT after calling WM_SETTEXT
[英]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
,则有效调整表格大小时。
InvalidateRect
也InvalidateRect
。
我究竟做错了什么?
提前致谢!
您无意发送WM_PAINT
。 这是一条特别合成的消息。 您永远不会发布或发送它。 而是调用InvalidateRect
或相关函数之一来使系统生成WM_PAINT
。
并且您无意在WM_PAINT
消息处理程序之外的窗口上绘制。 或来自GUI线程以外的其他线程。 也许您没有做任何这些事情,但是它们是常见的错误,因此提起来也没有什么害处。
如果InvalidateRect
无法正常工作,则您的代码存在一些根本问题。 您需要解决此问题,而不是尝试通过其他某种机制使绘画工作。
因此,解决方案是使用InvalidateRect
并修复WM_PAINT
处理程序中损坏的所有内容。 在没有看到您的WM_PAINT
处理程序的情况下,我不想推测出什么错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.