如何发布BITMAP结构?

时间:2019-01-30 14:21:44

标签: c winapi bitmap resources

使用BITMAP结构获取位图的信息后...

BITMAP bm;
HBITMAP hBitmap;
hBitmap = (HBITMAP)LoadImage(...);
GetObject(phBitmap, sizeof(BITMAP), &bm );

我应该如何释放/释放/处置bm

尝试过deleteDeleteObject,但都无效。

2 个答案:

答案 0 :(得分:1)

我会这样说

HBITMAP hBitmap;
hBitmap = (HBITMAP)LoadImage(...);

应该更好/更好

HANDLE handle = LoadImage(...);
if (NULL == handle)
{
  /*handle error */
}
else
{
  HBITMAP hbitmap = handle;

  {
    BITMAP bm = {0}; /* allocate and
            initialise bm on the stack. */

    GetObject(hbitmap, sizeof bm, &bm);

    /* Use bm here. */

   } /* Have bm be deallocated or at least
          be inaccessible from here on. */

   DeleteObject(hbitmap);
}

它是引用资源的句柄,当不再使用时应释放资源。

答案 1 :(得分:1)

如果您已将delete分配给运算符BITMAP,则只需使用运算符new。 (现代的,惯用的C ++也不鼓励手动进行内存管理,但是既然您在问题中提出了这个问题,就可以了。)

BITMAP是POD值维和像素数据的结构,并且HBITMAP可以是BITMAP的句柄(如果这样分配的话)。 HBITMAP 确实确实需要释放,并在不再需要且不再选择到DC中时调用DeleteObject,即使它已分配在堆栈中也是如此;堆栈上的BITMAP超出范围时将消失。

运算符delete与Windows GDI函数DeleteObject之间有区别。 delete是用于从堆中删除对象的C ++关键字; DeleteObject是用于释放GDI资源的API调用。