MFC CImageList DeleteImageList() vs Remove()

Posted

技术标签:

【中文标题】MFC CImageList DeleteImageList() vs Remove()【英文标题】: 【发布时间】:2019-09-18 03:03:46 【问题描述】:

有人有一些看起来像这样的清理代码:

for (int i = 0; i < m_pDragImage->GetImageCount();i++) 
  m_pDragImage->Remove(i);

m_pDragImage->DeleteImageList();
delete m_pDragImage;

现在我知道删除循环是错误的,应该是:

for (int i = 0; i < m_pDragImage->GetImageCount();) 
  if (!m_pDragImage->Remove(i)) 
    i++;
  

但现在的问题是,Remove() 循环中的所有内容与调用 DeleteImageList() 有什么区别?我理解它的方式,当你Add() 某些东西时,它只是保存它的位图表示,这样你就可以在Add() 之后销毁句柄。所以对我来说,Remove() 似乎会自己清理所有东西,所以不确定在这种情况下是否需要DeleteImageList()?或者更好的是,不用理会循环而只使用DeleteImageList(),或者更好的是,对象在销毁时执行它?

TIA!!

【问题讨论】:

阅读documentation并使用DeleteImageList 文档根本没有解释。 CImageList 具有自动清理功能,其他 MFC 类和大多数 c++ 类也一样。致电delete imagelist_object 就足够了。只需确保不再使用图像列表即可。 DeleteImageList 被暴露,以防你想重用指针。 Remove 会暴露在你不断添加/删除元素的情况下。 【参考方案1】:

DeleteImageList()Remove() 每个元素都在做同样的事情。

CImageList::Remove()CImageList::DeleteImageList() 分别调用 ImageList_Remove();ImageList_Destroy() Win API 函数。

根据Creating and Destroying Image Lists:

当您不再需要图像列表时,可以通过以下方式将其销毁 在调用ImageList_Destroy 函数时指定其句柄。

和Adding and Removing Images:

ImageList_Remove 函数从图像列表中删除图像。

这可能是 MFC 没有包装 ImageList_RemoveAll() 的原因(假设),因为 MFC 已经具有删除完整列表的功能 DeleteImageList()

【讨论】:

最好一步删除整个列表,而不是单独删除每个成员。

以上是关于MFC CImageList DeleteImageList() vs Remove()的主要内容,如果未能解决你的问题,请参考以下文章

MFC CListctr显示缩略图

MFC树控件CTreeCtrl

CImagelist 基本用法

如何在 MFC 中将图像添加到 CListCtrl

使用 MFC 在 MS Visual C++ 2008 中处理 .bmp 图像时出现颜色问题

CListCtrl 和 CImageList 访问 HBITMAP 进行修改