Also free internal handlers when wxMSW wxStaticBitmap is destroyed.

r76141 fixed the resource leak when wxStaticBitmap image was replaced by
another one but the leak still happened at the end, when the wxStaticBitmap
was destroyed.

Fix it there as well in the same way.

Closes #16068.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_3_0_BRANCH@76145 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2014-03-14 19:21:03 +00:00
parent 44611572b5
commit 15d82f05e1
2 changed files with 21 additions and 9 deletions

View File

@@ -85,6 +85,10 @@ protected:
WXHANDLE m_currentHandle;
private:
// Replace the image at the native control level with the given HBITMAP or
// HICON (which can be 0) and destroy the previous image if necessary.
void MSWReplaceImageHandle(WXLPARAM handle);
DECLARE_DYNAMIC_CLASS(wxStaticBitmap)
wxDECLARE_EVENT_TABLE();
wxDECLARE_NO_COPY_CLASS(wxStaticBitmap);

View File

@@ -190,6 +190,8 @@ wxBitmap wxStaticBitmap::GetBitmap() const
void wxStaticBitmap::Free()
{
MSWReplaceImageHandle(0);
wxDELETE(m_image);
}
@@ -251,6 +253,19 @@ void wxStaticBitmap::SetImage( const wxGDIImage* image )
SetImageNoCopy( convertedImage );
}
void wxStaticBitmap::MSWReplaceImageHandle(WXLPARAM handle)
{
HGDIOBJ oldHandle = (HGDIOBJ)::SendMessage(GetHwnd(), STM_SETIMAGE,
m_isIcon ? IMAGE_ICON : IMAGE_BITMAP, (LPARAM)handle);
// detect if this is still the handle we passed before or
// if the static-control made a copy of the bitmap!
if (oldHandle != 0 && oldHandle != (HGDIOBJ) m_currentHandle)
{
// the static control made a copy and we are responsible for deleting it
::DeleteObject((HGDIOBJ) oldHandle);
}
}
void wxStaticBitmap::SetImageNoCopy( wxGDIImage* image)
{
Free();
@@ -290,15 +305,8 @@ void wxStaticBitmap::SetImageNoCopy( wxGDIImage* image)
LONG style = ::GetWindowLong( (HWND)GetHWND(), GWL_STYLE ) ;
::SetWindowLong( (HWND)GetHWND(), GWL_STYLE, ( style & ~( SS_BITMAP|SS_ICON ) ) |
( m_isIcon ? SS_ICON : SS_BITMAP ) );
HGDIOBJ oldHandle = (HGDIOBJ)::SendMessage(GetHwnd(), STM_SETIMAGE,
m_isIcon ? IMAGE_ICON : IMAGE_BITMAP, (LPARAM)handle);
// detect if this is still the handle we passed before or
// if the static-control made a copy of the bitmap!
if (oldHandle != 0 && oldHandle != (HGDIOBJ) m_currentHandle)
{
// the static control made a copy and we are responsible for deleting it
::DeleteObject((HGDIOBJ) oldHandle);
}
MSWReplaceImageHandle((WXLPARAM)handle);
// Save bitmap handle only if it's not a temporary one, otherwise it's
// going to be destroyed right now anyhow.