]> git.saurik.com Git - wxWidgets.git/commitdiff
Center task dialog-based wxProgressDialog on the parent window.
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 23 Nov 2010 13:11:02 +0000 (13:11 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 23 Nov 2010 13:11:02 +0000 (13:11 +0000)
wxProgressDialog was created without the parent when using task dialogs so it
was centred on screen and not on its parent as usual. Fix this by explicitly
positioning it so that it's centered over the parent.

Closes #12699.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66244 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
src/msw/progdlg.cpp

index dac31aa9f435a54fc64980c678fbec19a7327271..5278f00faad380fd0aac2585d7bae6d4bc8fac65 100644 (file)
@@ -449,6 +449,7 @@ MSW:
 - Fix Cygwin 1.7 build (David Gangola).
 - Allow using wxDC::DrawText() with multiline texts.
 - Fix wxBitmapButton best size determination broken in 2.9.1.
+- Center task dialog-based wxProgressDialog on the parent (John Roberts).
 
 
 
index 4bceee31c709c1d7e550acc472f95e7fd72acb04..cf03fd80f13c6daa652cca553fc365a21c05d39a 100644 (file)
@@ -73,10 +73,12 @@ public:
         m_progressBarMarquee = false;
         m_skipped = false;
         m_notifications = 0;
+        m_parent = NULL;
     }
 
     wxCriticalSection m_cs;
 
+    wxWindow *m_parent;     // Parent window only used to center us over it.
     HWND m_hwnd;            // Task dialog handler
     long m_style;           // wxProgressDialog style
     int m_value;
@@ -632,6 +634,7 @@ bool wxProgressDialog::Show(bool show)
         m_sharedData->m_range = m_maximum;
         m_sharedData->m_state = Uncancelable;
         m_sharedData->m_style = GetPDStyle();
+        m_sharedData->m_parent = GetTopParent();
 
         if ( HasPDFlag(wxPD_CAN_ABORT) )
         {
@@ -821,6 +824,27 @@ wxProgressDialogTaskRunner::TaskDialogCallbackProc
                            0,
                            MAKELPARAM(0, sharedData->m_range) );
 
+            // We always create this task dialog with NULL parent because our
+            // parent in wx sense is a window created from a different thread
+            // and so can't be used as our real parent. However we still center
+            // this window on the parent one as the task dialogs do with their
+            // real parent usually.
+            if ( sharedData->m_parent )
+            {
+                wxRect rect(wxRectFromRECT(wxGetWindowRect(hwnd)));
+                rect = rect.CentreIn(sharedData->m_parent->GetRect());
+                ::SetWindowPos(hwnd,
+                               NULL,
+                               rect.x,
+                               rect.y,
+                               -1,
+                               -1,
+                               SWP_NOACTIVATE |
+                               SWP_NOOWNERZORDER |
+                               SWP_NOSIZE |
+                               SWP_NOZORDER);
+            }
+
             // If we can't be aborted, the "Close" button will only be enabled
             // when the progress ends (and not even then with wxPD_AUTO_HIDE).
             if ( !(sharedData->m_style & wxPD_CAN_ABORT) )