]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/gauge95.cpp
fix off by one (or rather "off by border width") bug in ScrollWindow() (part of patch...
[wxWidgets.git] / src / msw / gauge95.cpp
index 4d79cb7867588b04da94e2cfac681db7e48a0043..6f8d8724e4e569fd24cacd6fe75c381eff986ea1 100644 (file)
@@ -29,6 +29,8 @@
 #include "wx/gauge.h"
 
 #ifndef WX_PRECOMP
+    #include "wx/app.h"
+
     #include "wx/msw/wrapcctl.h" // include <commctrl.h> "properly"
 #endif
 
     #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
 // ----------------------------------------------------------------------------
@@ -142,6 +152,9 @@ bool wxGauge95::Create(wxWindow *parent,
 
     SetRange(range);
 
+    // in case we need to emulate indeterminate mode...
+    m_nDirection = wxRIGHT;
+
     return true;
 }
 
@@ -178,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
@@ -190,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);
@@ -215,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