]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/gauge95.cpp
implement wxListBox::EnsureVisible() in wxGTK; add a test for it to the widgets sample
[wxWidgets.git] / src / msw / gauge95.cpp
index e3ea695d8a4444cd58acede065310e42f941bb7b..6f8d8724e4e569fd24cacd6fe75c381eff986ea1 100644 (file)
     #pragma hdrstop
 #endif
 
-#ifndef WX_PRECOMP
-    #include "wx/defs.h"
-#endif
-
 #if wxUSE_GAUGE
 
 #include "wx/gauge.h"
-#include "wx/msw/private.h"
 
-#if !(defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__))
-    #include <commctrl.h>
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+
+    #include "wx/msw/wrapcctl.h" // include <commctrl.h> "properly"
 #endif
 
+#include "wx/msw/private.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
 // ----------------------------------------------------------------------------
@@ -95,7 +102,9 @@ wxBEGIN_FLAGS( wxGaugeStyle )
 
     wxFLAGS_MEMBER(wxGA_HORIZONTAL)
     wxFLAGS_MEMBER(wxGA_VERTICAL)
+#if WXWIN_COMPATIBILITY_2_6
     wxFLAGS_MEMBER(wxGA_PROGRESSBAR)
+#endif // WXWIN_COMPATIBILITY_2_6
     wxFLAGS_MEMBER(wxGA_SMOOTH)
 
 wxEND_FLAGS( wxGaugeStyle )
@@ -143,6 +152,9 @@ bool wxGauge95::Create(wxWindow *parent,
 
     SetRange(range);
 
+    // in case we need to emulate indeterminate mode...
+    m_nDirection = wxRIGHT;
+
     return true;
 }
 
@@ -179,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
@@ -191,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);
@@ -216,5 +234,43 @@ bool wxGauge95::SetBackgroundColour(const wxColour& col)
     return true;
 }
 
-#endif // wxUSE_GAUGE
+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