]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/gauge95.cpp
aui docking works well on systems with solid window dragging turned off
[wxWidgets.git] / src / msw / gauge95.cpp
index d3e137616b5319cd9061b563fc0dfe3318a1922f..6f8d8724e4e569fd24cacd6fe75c381eff986ea1 100644 (file)
 #include "wx/gauge.h"
 
 #ifndef WX_PRECOMP
+    #include "wx/app.h"
+
+    #include "wx/msw/wrapcctl.h" // include <commctrl.h> "properly"
 #endif
 
 #include "wx/msw/private.h"
 
-// include <commctrl.h> "properly"
-#include "wx/msw/wrapcctl.h"
-
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
     #define PBM_SETBKCOLOR          0x2001
 #endif
 
+#ifndef PBS_MARQUEE
+    #define PBS_MARQUEE             0x08
+#endif
+
+#ifndef PBM_SETMARQUEE
+    #define PBM_SETMARQUEE          (WM_USER+10)
+#endif
+
 // ----------------------------------------------------------------------------
 // wxWin macros
 // ----------------------------------------------------------------------------
@@ -144,6 +152,9 @@ bool wxGauge95::Create(wxWindow *parent,
 
     SetRange(range);
 
+    // in case we need to emulate indeterminate mode...
+    m_nDirection = wxRIGHT;
+
     return true;
 }
 
@@ -180,6 +191,9 @@ wxSize wxGauge95::DoGetBestSize() const
 
 void wxGauge95::SetRange(int r)
 {
+    // switch to determinate mode if required
+    SetDeterminateMode();
+
     m_rangeMax = r;
 
 #ifdef PBM_SETRANGE32
@@ -192,6 +206,9 @@ void wxGauge95::SetRange(int r)
 
 void wxGauge95::SetValue(int pos)
 {
+    // switch to determinate mode if required
+    SetDeterminateMode();
+
     m_gaugePos = pos;
 
     ::SendMessage(GetHwnd(), PBM_SETPOS, pos, 0);
@@ -217,4 +234,43 @@ bool wxGauge95::SetBackgroundColour(const wxColour& col)
     return true;
 }
 
+void wxGauge95::SetIndeterminateMode()
+{
+    // add the PBS_MARQUEE style to the progress bar
+    LONG style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
+    if ((style & PBS_MARQUEE) == 0)
+        ::SetWindowLong(GetHwnd(), GWL_STYLE, style|PBS_MARQUEE);
+
+    // now the control can only run in indeterminate mode
+}
+
+void wxGauge95::SetDeterminateMode()
+{
+    // remove the PBS_MARQUEE style to the progress bar
+    LONG style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
+    if ((style & PBS_MARQUEE) != 0)
+        ::SetWindowLong(GetHwnd(), GWL_STYLE, style & ~PBS_MARQUEE);
+
+    // now the control can only run in determinate mode
+}
+
+void wxGauge95::Pulse()
+{
+    if (wxApp::GetComCtl32Version() >= 600)
+    {
+        // switch to indeterminate mode if required
+        SetIndeterminateMode();
+
+        // NOTE: when in indeterminate mode, the PBM_SETPOS message will just make
+        //       the bar's blocks move a bit and the WPARAM value is just ignored
+        //       so that we can safely use zero
+        SendMessage(GetHwnd(), (UINT) PBM_SETPOS, (WPARAM)0, (LPARAM)0);
+    }
+    else
+    {
+        // emulate indeterminate mode
+        wxGaugeBase::Pulse();
+    }
+}
+
 #endif // wxUSE_GAUGE