无法在GDI +位图对象上绘制

时间:2009-08-04 01:13:13

标签: c++ gdi+ bitmap gdi draw

我正在用c ++ gdi gdi +编写程序。 在gdi +位图上绘制大图像很慢,使用gdi + api。 所以我使用以下方式绘制:

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的compatibleDC时,系统范围的池已满。似乎无法在Bitmap上绘制任何东西。

发生什么事了?当这部分代码失败时,我仍然可以使用GDI + API绘制图形

GetLastError()返回8.

非常感谢!

2 个答案:

答案 0 :(得分:1)

  

GetLastError()返回8

8是“没有足够的存储空间来处理此命令。”

因此,您的存储空间不足以供GDI用于执行::StretchDIBits

将来,您可以使用以下命令从命令行查找Windows错误:<{1}}。

答案 1 :(得分:0)

除了其他人所说的,Graphics对象实现了IDisposable。这意味着他们可能(并且实际上)持有有限的资源。确保您正在调用“gr.Dispose()”或将内容置于“使用”块中。如果不这样做,将由垃圾收集器决定何时完成对象以及释放其资源。对于资源密集型对象(例如Graphics。)来说,这是一种不好的做法。

根据大小,位图也可能是资源匮乏,因为它们可能占用大量RAM。如果您的代码示例中使用的位图从未在其后引用,也要确保它们被处理掉......