簡體   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