2012-10-09 43 views
1

我目前正在開發一個程序(C++ Win32,Visual Studio 2012),它捕捉來自麥克風的音頻信號,計算傅立葉變換(您知道,音頻中的頻率)在另一個線程中,最後將結果繪製在屏幕上。C++ Win32:使用SendMessage從另一個線程調用WM_PAINT,繪圖沒有效果

一切正常,除了繪圖,所以這是一個GUI相關的主題。

在WndProc中,我得到一個消息時緩衝區已滿,並準備進行處理,我稱之爲

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

開始計算線程。

截至ComputationThread年底我將消息發送到GUI線程繪製數據,使用預定義的固定值和數據指針作爲參數:

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

這工作得很好,以及,我得到的消息,並且我還可以將計算的數據寫入文件,但是,繪製在窗體上(例如使用SetPixel)沒有任何效果,但當wParam而不是PARAM_FFT_COMPUTED時(例如窗體大小調整時),它會起作用。

InvalidateRect也沒有效果。

我在做什麼錯?

在此先感謝!

回答

12

你並不是要發送WM_PAINT。這是一個特別合成的信息。你永遠不會發布或發送它。您可以撥打InvalidateRect或其中一個相關功能讓系統生成WM_PAINT

而且你並不是要在WM_PAINT消息處理程序之外的窗口上畫圖。或者從GUI線程以外的線程。也許你沒有做任何這些事情,但它們是常見的錯誤,所以提及它就不會有什麼傷害。

如果InvalidateRect不起作用,那麼你的代碼基本上是錯誤的。你需要解決這個問題,而不是試圖通過其他一些機制來完成繪畫。

因此,解決方案是使用InvalidateRect並修復您的WM_PAINT處理程序中損壞的任何內容。沒有看到你的WM_PAINT處理程序,我不想推測什麼是錯的。

相關問題