X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9d2c19f1367399be8d3220fa1c0fcdcb0ff6b6ae..69659fd770f615210efac4b4fa741b3ad6223616:/src/msw/gauge95.cpp diff --git a/src/msw/gauge95.cpp b/src/msw/gauge95.cpp index d3e137616b..6f8d8724e4 100644 --- a/src/msw/gauge95.cpp +++ b/src/msw/gauge95.cpp @@ -29,13 +29,13 @@ #include "wx/gauge.h" #ifndef WX_PRECOMP + #include "wx/app.h" + + #include "wx/msw/wrapcctl.h" // include "properly" #endif #include "wx/msw/private.h" -// include "properly" -#include "wx/msw/wrapcctl.h" - // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -57,6 +57,14 @@ #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