关键字:CTreeCtrl,CTreeView,TVS_CHECKBOXES,gdi,leak,泄漏,TVSIL_STAT
现象:单文档左侧是一个CDialogBar,里面有一个树控件,在int CFramePrint::OnCreate(LPCREATESTRUCT lpCreateStruct)有下面语句
if (!m_dlgFormBar.Create(this,IDD_DIALOGBAR,CBRS_LEFT | CBRS_NOALIGN ,IDD_DIALOGBAR))
{
TRACE0("Failed to create dialogbar\n");
return -1;
}
else
{
CWnd * pwnd=m_dlgFormBar.GetDlgItem(IDC_TREE1);
if(pwnd)
pwnd->ModifyStyle(0,TVS_CHECKBOXES);
}
无论使用任务管理器的gdi列还是网上的gdi泄漏检查工具,上面的ModifyStyle(0,TVS_CHECKBOXES);每次打开树控件然后关闭(CFramePrint继承于CFrameWnd且可以new),均会造成4个gdi对象泄漏(2DC+2Bitmap),可能复选框是2个图片,微软又没释放吧。。。
没办法,想到自绘树控件,不过碰到了TVSIL_STATE这个关键字,问题顺势就解决了,也没自绘
解决:
void CFormTreeBar::OnDestroy()
{
CTreeCtrl* pTree =(CTreeCtrl*)GetDlgItem(IDC_TREE1);
// If a treeview control is created with TVS_CHECKBOXES, the application has to
// delete the image list which was implicitly created by the control.
CImageList *piml = pTree->GetImageList(TVSIL_STATE);
if (piml)
piml->DeleteImageList();
CDialogBar::OnDestroy();
}
检测工具:http://download.csdn.net/detail/dragoo1/4987501
参考:
http://bbs.csdn.net/topics/390071062
http://bbs.csdn.net/topics/390071063
http://bbs.csdn.net/topics/60456009
http://www.codeproject.com/Messages/2125662/GDI-Leak-in-CTreeCtrl-with-TVS_CHECKBOXES-property.aspx
http://bbs.csdn.net/topics/340164927
http://blog.csdn.net/vvviippp/article/details/7046458
http://support.microsoft.com/kb/224181/zh-cn
http://www.oschina.net/code/explore/eMule-0.50a/srchybrid/DirectoryTreeCtrl.cpp
http://wenku.baidu.com/view/95f236c72cc58bd63186bd98.html
http://st251256589.blog.163.com/blog/static/16487644920116610418905/
http://download.pudn.com/downloads/sourcecode/windows/control/treeview/507363TreeWithCheckBoxes_demo.zip
http://www.codeproject.com/script/articles/download.aspx?file=/KB/tree/VividTree/VividTree_demo.zip&rp=http://www.codeproject.com/Articles/11722/VividTree-A-Colorful-and-Picturesque-Owner-Drawn-C