Don't use a destroy event handler to disconnect the native control's delegate as the destroy event propagates and can cause the TLW to remove its delegate at unexpected times, such as when a child control is destroyed but the TLW remains active. Instead, do it in response to the Destroy() call.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63051 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Kevin Ollivier
2010-01-03 23:59:32 +00:00
parent d9edff064d
commit e2758e2175
2 changed files with 10 additions and 6 deletions

View File

@@ -104,6 +104,8 @@ public:
virtual void HandleMoved( double timestampsec ); virtual void HandleMoved( double timestampsec );
virtual void HandleResizing( double timestampsec, wxRect* rect ); virtual void HandleResizing( double timestampsec, wxRect* rect );
virtual bool Destroy();
protected: protected:
// common part of all ctors // common part of all ctors
void Init(); void Init();
@@ -117,7 +119,7 @@ protected:
wxShowEffect effect, wxShowEffect effect,
unsigned timeout); unsigned timeout);
void OnWindowDestroy( wxWindowDestroyEvent &event); virtual void WillBeDestroyed();
wxNonOwnedWindowImpl* m_nowpeer ; wxNonOwnedWindowImpl* m_nowpeer ;

View File

@@ -147,9 +147,6 @@ bool wxNonOwnedWindow::Create(wxWindow *parent,
if ( parent ) if ( parent )
parent->AddChild(this); parent->AddChild(this);
wxBIND_OR_CONNECT_HACK(this, wxEVT_DESTROY, wxWindowDestroyEventHandler,
wxNonOwnedWindow::OnWindowDestroy, this);
return true; return true;
} }
@@ -169,10 +166,15 @@ wxNonOwnedWindow::~wxNonOwnedWindow()
s_macDeactivateWindow = NULL; s_macDeactivateWindow = NULL;
} }
void wxNonOwnedWindow::OnWindowDestroy( wxWindowDestroyEvent &event) bool wxNonOwnedWindow::Destroy()
{ {
event.Skip(); WillBeDestroyed();
return wxWindow::Destroy();
}
void wxNonOwnedWindow::WillBeDestroyed()
{
if ( m_nowpeer ) if ( m_nowpeer )
m_nowpeer->WillBeDestroyed(); m_nowpeer->WillBeDestroyed();
} }