2009-08-04 105 views
0

我正在使用C++ gdi gdi +編寫程序。 在gdi +位圖上繪製大圖像比較慢,是使用gdi + api。 所以我用下面的方法來繪製:無法在GDI +上繪製位圖對象

Bitmap img(xxx); 
Graphics gr(&img); 
HDC dc = gr.GetHDC(); 
::StretchDIBits( 
    dc, 
    rec.left, rec.top, 
    (rec.right - rec.left), (rec.bottom - rec.top), 
    m_recRegin.left , m_recRegin.top, 
    m_recRegin.right - m_recRegin.left, m_recRegin.bottom - m_recRegin.top, 
    XXX, XXX, DIB_RGB_COLORS, SRCCOPY); 
gr.ReleaseHDC(dc); 

這段代碼完美運行一段時間。 但是,當通過創建大量具有大尺寸CBitmap的兼容DC時全系統池已滿。它似乎無法在Bitmap上繪製任何東西。

發生了什麼事?當這部分代碼失敗了,我還可以對顯卡採用GDI +的API

GetLastError函數()的返回8.

非常感謝抽獎!

+1

請在調用StretchDIBits()失敗後,使用由GetLastError()返回的值更新我們。 – arul 2009-08-04 02:12:32

回答

1

GetLastError函數()的返回8

8是 「沒有足夠的存儲可用來處理該命令。」

因此,您的GDI存儲空間用完後用於執行::StretchDIBits

將來,您可以通過命令行查找Windows錯誤:net helpmsg <error in decimal>

+0

謝謝!但如果發生這種情況,我該如何爲GDI提供足夠的存儲空間? – user25749 2009-08-10 01:21:45

0

除了別人所說的之外,Graphics對象還實現了IDisposable。這意味着他們可能(並且實際上)持有有限的資源。確保你正在調用「gr.Dispose()」或把東西放在「使用」塊中。如果未能做到這一點,則會留給垃圾收集器來確定何時完成對象並釋放其資源。對於資源密集型的對象來說這是一個不好的做法 - 比如Graphics。

根據大小位圖也可能是資源飢渴,因爲他們可以吃大量的RAM。如果代碼示例中使用的位圖從未被引用,請確保它們正在處理...