【问题标题】:can not draw on GDI+ bitmap object无法在 GDI+ 位图对象上绘图
【发布时间】:2010-11-16 13:21:02
【问题描述】:

我正在用 c++ 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。

非常感谢!

【问题讨论】:

  • 请在调用 StretchDIBits() 失败后使用 GetLastError() 返回的值更新我们。

标签: c++ gdi+ bitmap gdi draw


【解决方案1】:

GetLastError() 返回 8

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

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

以后,您可以使用以下命令从命令行查找 Windows 错误:net helpmsg <error in decimal>

【讨论】:

  • 谢谢!但如果发生这种情况,我怎样才能为 GDI 提供足够的存储空间?
  • 不要创建这么多DC?为什么需要这么多 DC 而不仅仅是很多位图?
【解决方案2】:

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

根据大小,位图也可能会占用大量资源,因为它们会占用大量 RAM。如果您的代码示例中使用的位图从未在其后被引用,请确保它们被丢弃...

【讨论】:

    猜你喜欢
    • 2022-08-17
    • 1970-01-01
    • 2020-02-16
    • 2014-08-01
    • 2021-08-03
    • 2013-06-01
    • 2011-01-09
    • 2012-03-31
    • 2012-05-10
    相关资源
    最近更新 更多