X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/085ad68651cd624a11331f5ab2cb2720bd7162aa..3fc6e5fa23909c701654001a895f2ba95751e0af:/src/msw/toplevel.cpp diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index 3a25093115..1e6fc3de12 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -35,6 +35,7 @@ #include "wx/log.h" #include "wx/intl.h" #include "wx/frame.h" + #include "wx/containr.h" // wxSetFocusToChild() #endif //WX_PRECOMP #include "wx/msw/private.h" @@ -60,6 +61,11 @@ static inline bool IsZoomed(HWND WXUNUSED(hwnd)) { return FALSE; } #endif // __WXMICROWIN__ +// NB: wxDlgProc must be defined here and not in dialog.cpp because the latter +// is not included by wxUniv build which does need wxDlgProc +LONG APIENTRY _EXPORT +wxDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); + // ---------------------------------------------------------------------------- // globals // ---------------------------------------------------------------------------- @@ -81,28 +87,6 @@ BEGIN_EVENT_TABLE(wxTopLevelWindowMSW, wxTopLevelWindowBase) EVT_ACTIVATE(wxTopLevelWindowMSW::OnActivate) END_EVENT_TABLE() -// ---------------------------------------------------------------------------- -// wxDialog helpers -// ---------------------------------------------------------------------------- - -// Dialog window proc -LONG APIENTRY _EXPORT -wxDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch ( message ) - { - case WM_INITDIALOG: - // for this message, returning TRUE tells system to set focus to - // the first control in the dialog box, but as we set the focus - // ourselves, we return FALSE from here as well, so fall through - - default: - // for all the other ones, FALSE means that we didn't process the - // message - return FALSE; - } -} - // ---------------------------------------------------------------------------- // wxTopLevelWindowMSW creation // ---------------------------------------------------------------------------- @@ -260,7 +244,7 @@ WXHWND wxTopLevelWindowMSW::MSWGetParent() const parent = ms_hiddenParent; } - return parent ? parent->GetHWND() : NULL; + return parent ? parent->GetHWND() : WXHWND(NULL); } bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate, @@ -470,12 +454,12 @@ wxTopLevelWindowMSW::~wxTopLevelWindowMSW() if ( this == ms_hiddenParent ) { // stop [infinite] recursion which would otherwise happen when we do - // "delete ms_hiddenParent" below + // "delete ms_hiddenParent" below -- and we're not interested in doing + // anything of the rest below for that window because the rest of + // wxWindows doesn't even know about it return; } - wxTopLevelWindows.DeleteObject(this); - if ( wxModelessWindows.Find(this) ) wxModelessWindows.DeleteObject(this); @@ -492,21 +476,15 @@ wxTopLevelWindowMSW::~wxTopLevelWindowMSW() } } - // If this is the last top-level window, exit. - if ( wxTheApp && (wxTopLevelWindows.Number() == 0) ) + // if this is the last top-level window, we're going to exit and we should + // delete ms_hiddenParent now to avoid leaking it + if ( IsLastBeforeExit() ) { if ( ms_hiddenParent ) { delete ms_hiddenParent; ms_hiddenParent = NULL; } - - wxTheApp->SetTopWindow(NULL); - - if ( wxTheApp->GetExitOnFrameDelete() ) - { - ::PostQuitMessage(0); - } } } @@ -800,3 +778,21 @@ void wxTopLevelWindowMSW::OnActivate(wxActivateEvent& event) } } +// the DialogProc for all wxWindows dialogs +LONG APIENTRY _EXPORT +wxDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch ( message ) + { + case WM_INITDIALOG: + // for this message, returning TRUE tells system to set focus to + // the first control in the dialog box, but as we set the focus + // ourselves, we return FALSE from here as well, so fall through + + default: + // for all the other ones, FALSE means that we didn't process the + // message + return FALSE; + } +} +