]> git.saurik.com Git - wxWidgets.git/commitdiff
choose implicit parent for the dialog boxes better, fixes weird focus jumps when...
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 2 Sep 2002 00:44:24 +0000 (00:44 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 2 Sep 2002 00:44:24 +0000 (00:44 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16927 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/msw/dialog.h
src/msw/dialog.cpp
src/msw/msgdlg.cpp

index 216d413a037dc95177913a9610bd001954656f5f..eab31c77a977c9643b139dcd7fb17a76f4fe030b 100644 (file)
@@ -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)
index 31326c37c773459063d3bf67aa1689601828eceb..3a779079b4e08191d675151d66d43b81df5f3624 100644 (file)
@@ -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();
 
index f37849b3ee09e7ce847b57e59a05506a1225d894..748ef0595f8a1d09be1660d5518c87efa0110668 100644 (file)
@@ -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();
index 834fbdb022943388947b4915608c1e6c812a4b46..af52a3d595c32ff8f2fd1b9309563c52343a80e6 100644 (file)
@@ -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;