【发布时间】:2018-12-18 05:55:27
【问题描述】:
Win32:
创建树控件并将样式更改为 TVS_CHECKBOXES,然后将 TVSIL_STATE 的 ImageList 更改为自定义 ImageList,您是否需要删除返回的先前 ImageList 或者它是共享资源并且不应该。
MFC:
由于存在对象层次结构,在这种情况下,您不知道 CImageList 是替换系统提供的对象还是来自父类之一。在那种情况下,正确的处理方式是什么?对于ImageLists,你能不能CImageList::Attach()、CTreeCtrl::SetImageList()、CImageList::Detach()然后CTreeCtrl::OnDestroy()继续CImageList *pil=CTreeCtrl::SetImageList(NULL, TVSIL_STATE)然后pil->DeleteImageList(),但是那个对象呢,我们应该用delete pil代替吗?或者我们是否总是需要设置一个成员变量,即图像列表,只需 CTreeCtrl::SetImageList() 更改它,然后 OnDestroy() 放回旧变量或将其设置为 NULL?
【问题讨论】:
-
所以在 Win32 的情况下,这意味着是。使用 CImageLists 的 MFC 案例呢?
-
MFC 是一个非常薄的包装器,所以我猜它是一样的,但不确定。
-
检查任务管理器的 GDI 句柄。
-
CTreeCtrl::SetImageList()返回一个 temporary 对象(通过CImageList::FromHandle()),该对象不拥有它所包装的句柄。你必须DeleteImageList()来避免资源泄漏(见第一条评论),但不要在SetImageList返回的指针上使用delete。 MFC 在空闲处理期间自动清理临时对象。 More about that.