From a543e3ce7e0691f771f245bcf5402cd1fbd2b829 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 2 Sep 2002 00:44:24 +0000 Subject: [PATCH] choose implicit parent for the dialog boxes better, fixes weird focus jumps when using wxLog git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16927 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/msw/dialog.h | 6 ++++++ src/msw/dialog.cpp | 29 +++++++++++++++++++++++------ src/msw/msgdlg.cpp | 11 ++++------- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 216d413a03..eab31c77a9 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -253,6 +253,7 @@ wxMSW: - fixed redraw problems in dynamically resized wxStaticText - improvements to wxWindows applications behaviour when the system colours are changed +- choose implicit parent for the dialog boxes better - fixed wxProgressDialog for ranges > 65535 - wxSpinButton and wxSpinCtrl now support full 32 bit range (if the version of comctl32.dll installed on the system supports it) diff --git a/include/wx/msw/dialog.h b/include/wx/msw/dialog.h index 31326c37c7..3a779079b4 100644 --- a/include/wx/msw/dialog.h +++ b/include/wx/msw/dialog.h @@ -98,6 +98,12 @@ public: #endif // wxUSE_CTL3D protected: + // find the window to use as parent for this dialog if none has been + // specified explicitly by the user + // + // may return NULL + wxWindow *FindSuitableParent() const; + // show modal dialog and enter modal loop void DoShowModal(); diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index f37849b3ee..748ef0595f 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -194,6 +194,28 @@ bool wxDialog::IsModalShowing() const return wxModalDialogs.Find((wxDialog *)this) != NULL; // const_cast } +wxWindow *wxDialog::FindSuitableParent() const +{ + // first try to use the currently active window + HWND hwndFg = ::GetForegroundWindow(); + wxWindow *parent = hwndFg ? wxFindWinFromHandle((WXHWND)hwndFg) + : NULL; + if ( !parent ) + { + // next try the main app window + parent = wxTheApp->GetTopWindow(); + } + + // finally, check if the parent we found is really suitable + if ( !parent || parent == (wxWindow *)this || !parent->IsShown() ) + { + // don't use this one + parent = NULL; + } + + return parent; +} + void wxDialog::DoShowModal() { wxCHECK_RET( !IsModalShowing(), _T("DoShowModal() called twice") ); @@ -285,12 +307,7 @@ bool wxDialog::Show(bool show) // modal dialog needs a parent window, so try to find one if ( !GetParent() ) { - wxWindow *parent = wxTheApp->GetTopWindow(); - if ( parent && parent != this && parent->IsShown() ) - { - // use it - m_parent = parent; - } + m_parent = FindSuitableParent(); } DoShowModal(); diff --git a/src/msw/msgdlg.cpp b/src/msw/msgdlg.cpp index 834fbdb022..af52a3d595 100644 --- a/src/msw/msgdlg.cpp +++ b/src/msw/msgdlg.cpp @@ -46,8 +46,7 @@ wxMessageDialog::wxMessageDialog(wxWindow *parent, int wxMessageDialog::ShowModal() { - wxWindow *winTop = wxTheApp->GetTopWindow(); - if ( !winTop ) + if ( !wxTheApp->GetTopWindow() ) { // when the message box is shown from wxApp::OnInit() (i.e. before the // message loop is entered), this must be done or the next message box @@ -58,11 +57,9 @@ int wxMessageDialog::ShowModal() } // use the top level window as parent if none specified - HWND hWnd = 0; - if ( m_parent ) - hWnd = GetHwndOf(m_parent); - else if ( winTop ) - hWnd = GetHwndOf(winTop); + if ( !m_parent ) + m_parent = FindSuitableParent(); + HWND hWnd = m_parent ? GetHwndOf(m_parent) : NULL; // translate wx style in MSW unsigned int msStyle = MB_OK;