可怕的繪圖資源異常Bug

  1. 可怕的繪圖資源異常Bug

可怕的繪圖資源異常Bug

原文連結: https://darkblack01.blogspot.com/2012/01/bug.html
移植時的最後更新日期: 2012-01-29T18:37:01.400+08:00


上次說繪圖出現問題的bug
抓到了!

真是發生奇蹟了!

奇蹟指的是,我竟然看出來(或者想得到)問題在這個方向…
而不是專注在某一段語法產生的問題。


因為TextOut是正常的,所以仔細觀察發現CBrush和CPen重繪次數超過一定的數量(很大的數量)就會崩潰,和它們被DeleteObject一樣

所以,就針對這兩個物件做檢查,並且上網看看人家都怎麼做的…

發現…

Pen 部份
OldPen = dc.SelectObject(NewPen);
(繪圖)
dc.SelectObject(OldPen);

Brush的部份
m_brBack.DeleteObject(); 
m_brBack.CreateSolidBrush(RGB(255,255,0)); 

做了
1. 儲存預設
2. 新的筆或筆刷替代預設
3. 繪圖
4. 再將預設值替代新的筆或筆刷
的動作

程式的繪圖就不會因為次數太多,而失控。

因為我用 MFC寫了UI介面動畫,所以要快速且大量的更新畫面
才會出現這樣的問題。
哈哈~~


原本的寫法是如下,單純的只是將它設定而已。

Pen 部份
dc.SelectObject(NewPen);
(繪圖)


Brush的部份
m_brBack.CreateSolidBrush(RGB(255,255,0)); 



大神回覆:
You need to make sure the  graphic resources such as Pen and Brush are released ( by calling DeleteObject )after you are done with them.
Otherwise, you might run out of resource quickly.  This also explain why  when WM_PAINT is not called, you don’t see this problem.
Suggestion:
 Add some code to keep track the graphic resource allocation/deallocation count to see if they are equal.
If they are not, force your program to stop (by adding an assertation), that way you could easily spotting resource leakage.