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()的主要内容,如果未能解决你的问题,请参考以下文章