From 8da1f9a99ee0ff9493cc7845ec13100cdeac431c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 12 Dec 2004 17:47:06 +0000 Subject: [PATCH] delete children in ~wxWindow dtor and not in the base class ~wxWindowNative as it's too late there (replaces patch 1082605; closes bug 1068000) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30959 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/univ/window.h | 2 ++ src/univ/winuniv.cpp | 24 ++++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/include/wx/univ/window.h b/include/wx/univ/window.h index 3761d2e79d..c39940a21a 100644 --- a/include/wx/univ/window.h +++ b/include/wx/univ/window.h @@ -73,6 +73,8 @@ public: long style = 0, const wxString& name = wxPanelNameStr); + virtual ~wxWindow(); + // background pixmap support // ------------------------- diff --git a/src/univ/winuniv.cpp b/src/univ/winuniv.cpp index 21deb2f067..6d57da70e0 100644 --- a/src/univ/winuniv.cpp +++ b/src/univ/winuniv.cpp @@ -122,13 +122,13 @@ bool wxWindow::Create(wxWindow *parent, const wxString& name) { long actualStyle = style; - + // FIXME: may need this on other platforms #ifdef __WXMSW__ actualStyle &= ~wxVSCROLL; actualStyle &= ~wxHSCROLL; -#endif - +#endif + // we add wxCLIP_CHILDREN to get the same ("natural") behaviour under MSW // as under the other platforms if ( !wxWindowNative::Create(parent, id, pos, size, @@ -169,7 +169,7 @@ bool wxWindow::Create(wxWindow *parent, SetInsertIntoMain( false ); #endif } - + if (m_scrollbarHorz || m_scrollbarVert) { // position it/them @@ -179,6 +179,18 @@ bool wxWindow::Create(wxWindow *parent, return true; } +wxWindow::~wxWindow() +{ + m_isBeingDeleted = true; + + // we have to destroy our children before we're destroyed because our + // children suppose that we're of type wxWindow, not just wxWindowNative, + // and so bad things may happen if they're deleted from the base class dtor + // as by then we're not a wxWindow any longer and wxUniv-specific virtual + // functions can't be called + DestroyChildren(); +} + // ---------------------------------------------------------------------------- // background pixmap // ---------------------------------------------------------------------------- @@ -426,11 +438,11 @@ void wxWindow::Refresh(bool eraseBackground, const wxRect *rectClient) while ( node ) { wxWindow *win = node->GetData(); - // Only refresh sub controls when it is visible + // Only refresh sub controls when it is visible // and when it is in the update region. if(!win->IsKindOf(CLASSINFO(wxTopLevelWindow)) && win->IsShown() && wxRegion(rectWin).Contains(win->GetRect()) != wxOutRegion) win->Refresh(eraseBackground, &rectWin); - + node = node->GetNext(); } } -- 2.45.2