mirror of
https://github.com/reactos/reactos.git
synced 2024-08-07 19:58:21 +00:00
fixed more GDI handle leaks
svn path=/trunk/; revision=8357
This commit is contained in:
parent
7db5e43a17
commit
4438a2a27c
|
@ -274,8 +274,14 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam)
|
|||
if (!last_id)
|
||||
found->second._id = pThis->_next_id++;
|
||||
} else {
|
||||
HBITMAP hbmp;
|
||||
HICON hIcon = get_window_icon(hwnd);
|
||||
HBITMAP hbmp = hIcon? create_bitmap_from_icon(hIcon, GetSysColorBrush(COLOR_BTNFACE), WindowCanvas(pThis->_htoolbar)): 0;
|
||||
|
||||
if (hIcon) {
|
||||
hbmp = create_bitmap_from_icon(hIcon, GetSysColorBrush(COLOR_BTNFACE), WindowCanvas(pThis->_htoolbar));
|
||||
DestroyIcon(hIcon); // some icons can be freed, some not - so ignore any error return of DestroyIcon()
|
||||
} else
|
||||
hbmp = 0;
|
||||
|
||||
TBADDBITMAP ab = {0, (UINT_PTR)hbmp};
|
||||
int bmp_idx = SendMessage(pThis->_htoolbar, TB_ADDBITMAP, 1, (LPARAM)&ab);
|
||||
|
@ -358,6 +364,7 @@ void TaskBar::Refresh()
|
|||
//EnumDesktopWindows(GetThreadDesktop(GetCurrentThreadId()), EnumWndProc, (LPARAM)_htoolbar);
|
||||
|
||||
set<int> btn_idx_to_delete;
|
||||
set<HBITMAP> hbmp_to_delete;
|
||||
|
||||
for(TaskBarMap::iterator it=_map.begin(); it!=_map.end(); ++it) {
|
||||
TaskBarEntry& entry = it->second;
|
||||
|
@ -365,6 +372,7 @@ void TaskBar::Refresh()
|
|||
if (!entry._used && entry._id) {
|
||||
// store button indexes to remove
|
||||
btn_idx_to_delete.insert(entry._btn_idx);
|
||||
hbmp_to_delete.insert(entry._hbmp);
|
||||
entry._id = 0;
|
||||
}
|
||||
}
|
||||
|
@ -385,6 +393,21 @@ void TaskBar::Refresh()
|
|||
}
|
||||
}
|
||||
|
||||
for(set<HBITMAP>::iterator it=hbmp_to_delete.begin(); it!=hbmp_to_delete.end(); ++it) {
|
||||
HBITMAP hbmp = *it;
|
||||
|
||||
TBREPLACEBITMAP tbrepl = {0, (UINT_PTR)hbmp, 0, 0};
|
||||
SendMessage(_htoolbar, TB_REPLACEBITMAP, 0, (LPARAM)&tbrepl);
|
||||
|
||||
DeleteObject(hbmp);
|
||||
|
||||
for(TaskBarMap::iterator it=_map.begin(); it!=_map.end(); ++it)
|
||||
if (it->second._hbmp == hbmp) {
|
||||
_map.erase(it);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
SendMessage(_htoolbar, TB_AUTOSIZE, 0, 0); ///@todo useless?
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue