2009-08-04 104 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。如果代码示例中使用的位图从未被引用,请确保它们正在处理...