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:
@@ -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);
|
||||
|
@@ -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.
|
||||
|
Reference in New Issue
Block a user