Use PBM_SETMARQUEE to implement indeterminate mode in wxMSW wxGauge.

The old code which simply used PBM_SETPOS after setting PBS_MARQUEE style
often worked but sometimes apparently didn't, so switch to the officially
sanctioned PBM_SETMARQUEE to implement this.

Also make wxGauge::SetDeterminateMode() and SetIndeterminateMode() methods
private as they are not part of the public class API.

Closes #11357.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64648 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-06-20 17:43:02 +00:00
parent f074df3446
commit aaaa607018
3 changed files with 41 additions and 29 deletions

View File

@@ -51,10 +51,7 @@ public:
virtual bool SetForegroundColour(const wxColour& col); virtual bool SetForegroundColour(const wxColour& col);
virtual bool SetBackgroundColour(const wxColour& col); virtual bool SetBackgroundColour(const wxColour& col);
virtual void Pulse();
void SetIndeterminateMode();
void SetDeterminateMode();
void Pulse();
WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
@@ -64,6 +61,15 @@ public:
protected: protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;
private:
// returns true if the control is currently in indeterminate (a.k.a.
// "marquee") mode
bool IsInIndeterminateMode() const;
// switch to/from indeterminate mode
void SetIndeterminateMode();
void SetDeterminateMode();
DECLARE_DYNAMIC_CLASS_NO_COPY(wxGauge) DECLARE_DYNAMIC_CLASS_NO_COPY(wxGauge)
}; };

View File

@@ -389,6 +389,8 @@ void GaugeWidgetsPage::OnButtonIndeterminateProgress(wxCommandEvent& event)
{ {
StopTimer(b); StopTimer(b);
m_gauge->SetValue(0);
wxLogMessage(wxT("Stopped the timer.")); wxLogMessage(wxT("Stopped the timer."));
} }
} }

View File

@@ -193,8 +193,9 @@ wxSize wxGauge::DoGetBestSize() const
void wxGauge::SetRange(int r) void wxGauge::SetRange(int r)
{ {
// switch to determinate mode if required // Changing range implicitly means we're using determinate mode.
SetDeterminateMode(); if ( IsInIndeterminateMode() )
SetDeterminateMode();
m_rangeMax = r; m_rangeMax = r;
@@ -208,16 +209,16 @@ void wxGauge::SetRange(int r)
void wxGauge::SetValue(int pos) void wxGauge::SetValue(int pos)
{ {
// Setting the (same) position produces flicker on Vista, // Setting the value implicitly means that we're using determinate mode.
// especially noticable if ownerdrawn if ( IsInIndeterminateMode() )
if (GetValue() == pos) return; SetDeterminateMode();
// switch to determinate mode if required if ( GetValue() != pos )
SetDeterminateMode(); {
m_gaugePos = pos;
m_gaugePos = pos; ::SendMessage(GetHwnd(), PBM_SETPOS, pos, 0);
}
::SendMessage(GetHwnd(), PBM_SETPOS, pos, 0);
} }
bool wxGauge::SetForegroundColour(const wxColour& col) bool wxGauge::SetForegroundColour(const wxColour& col)
@@ -240,24 +241,30 @@ bool wxGauge::SetBackgroundColour(const wxColour& col)
return true; return true;
} }
bool wxGauge::IsInIndeterminateMode() const
{
return (::GetWindowLong(GetHwnd(), GWL_STYLE) & PBS_MARQUEE) != 0;
}
void wxGauge::SetIndeterminateMode() void wxGauge::SetIndeterminateMode()
{ {
// add the PBS_MARQUEE style to the progress bar // Switch the control into indeterminate mode if necessary.
LONG style = ::GetWindowLong(GetHwnd(), GWL_STYLE); if ( !IsInIndeterminateMode() )
if ((style & PBS_MARQUEE) == 0) {
::SetWindowLong(GetHwnd(), GWL_STYLE, style|PBS_MARQUEE); const long style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
::SetWindowLong(GetHwnd(), GWL_STYLE, style | PBS_MARQUEE);
// now the control can only run in indeterminate mode ::SendMessage(GetHwnd(), PBM_SETMARQUEE, TRUE, 0);
}
} }
void wxGauge::SetDeterminateMode() void wxGauge::SetDeterminateMode()
{ {
// remove the PBS_MARQUEE style to the progress bar if ( IsInIndeterminateMode() )
LONG style = ::GetWindowLong(GetHwnd(), GWL_STYLE); {
if ((style & PBS_MARQUEE) != 0) const long style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
::SendMessage(GetHwnd(), PBM_SETMARQUEE, FALSE, 0);
::SetWindowLong(GetHwnd(), GWL_STYLE, style & ~PBS_MARQUEE); ::SetWindowLong(GetHwnd(), GWL_STYLE, style & ~PBS_MARQUEE);
}
// now the control can only run in determinate mode
} }
void wxGauge::Pulse() void wxGauge::Pulse()
@@ -267,10 +274,7 @@ void wxGauge::Pulse()
// switch to indeterminate mode if required // switch to indeterminate mode if required
SetIndeterminateMode(); SetIndeterminateMode();
// NOTE: when in indeterminate mode, the PBM_SETPOS message will just make SendMessage(GetHwnd(), PBM_STEPIT, 0, 0);
// 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 else
{ {