DeleteImageList returns with NULL and the program gets GDI resourc
Hi all,
I'm working on a windows XP SP3 computer with VC++ 2005.
I will change the standard toolbar to a true color toolbar.
The following function works fine, but I get GDI resource leaks.
Every time the call "m_pColdImageList->DeleteImageList();" returns with "0"
and
and the call "m_pHotImageList->DeleteImageList();" returns with "1".
If the return value is "0", the GDI resource counter increments.
When I don??t send the "TB_SETIMAGELIST" to the toolbar, I don??t get a leak.
Unfortunately the result is not the same. :(
Certainly the code is not very optimized. When I call the function
CreateToolbarsWithLeaks(), the m_pHotToolBar and the both imagelists will be
created again. But I need for another application exact such a construct.
I don??t understand why the "DeleteImageList" function return with "0".
Can anybody help me.
void CMainFrame::CreateToolbarsWithLeaks()
{
if (m_pHotToolBar)
{
delete m_pHotToolBar;
m_pHotToolBar = NULL;
}
if (m_pColdImageList)
{
BOOL bRet = m_pColdImageList->DeleteImageList();
delete m_pColdImageList;
m_pColdImageList = NULL;
}
if (m_pHotImageList)
{
BOOL bRet = m_pHotImageList->DeleteImageList();
delete m_pHotImageList;
m_pHotImageList = NULL;
}
m_pHotToolBar = new CToolBar;
if (!m_pHotToolBar->Create(this) ||
!m_pHotToolBar->LoadToolBar(IDR_HOTBAR))
{
TRACE0("Failed to create toolbar\n");
return ; // fail to create
}
m_pHotToolBar->ModifyStyle(0, TBSTYLE_FLAT);
// Set up hot bar image lists.
CBitmap bitmapCold;
CBitmap bitmapHot;
if (!m_pColdImageList)
m_pColdImageList = new CImageList;
if (!m_pHotImageList)
m_pHotImageList = new CImageList;
// Create and set the normal toolbar image list.
bitmapCold.LoadBitmap(IDB_TOOLBAR_COLD);
m_pColdImageList->Create(21, 20, ILC_COLORDDB|ILC_MASK, 13, 1);
m_pColdImageList->Add(&bitmapCold, RGB(255,0,255));
m_pHotToolBar->SendMessage(TB_SETIMAGELIST, 0,
(LPARAM)m_pColdImageList->m_hImageList);
DeleteObject(bitmapCold);
// Create and set the hot toolbar image list.
bitmapHot.LoadBitmap(IDB_TOOLBAR_HOT);
m_pHotImageList->Create(21, 20, ILC_COLORDDB|ILC_MASK, 13, 1);
m_pHotImageList->Add(&bitmapHot, RGB(255,0,255));
m_pHotToolBar->SendMessage(TB_SETHOTIMAGELIST, 0,
(LPARAM)m_pHotImageList->m_hImageList);
DeleteObject(bitmapHot);
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_pHotToolBar->EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
DockControlBar(m_pHotToolBar);
}
Thanks for any reply :)