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:
@@ -51,10 +51,7 @@ public:
|
||||
virtual bool SetForegroundColour(const wxColour& col);
|
||||
virtual bool SetBackgroundColour(const wxColour& col);
|
||||
|
||||
|
||||
void SetIndeterminateMode();
|
||||
void SetDeterminateMode();
|
||||
void Pulse();
|
||||
virtual void Pulse();
|
||||
|
||||
WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
|
||||
|
||||
@@ -64,6 +61,15 @@ public:
|
||||
protected:
|
||||
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)
|
||||
};
|
||||
|
||||
|
@@ -389,6 +389,8 @@ void GaugeWidgetsPage::OnButtonIndeterminateProgress(wxCommandEvent& event)
|
||||
{
|
||||
StopTimer(b);
|
||||
|
||||
m_gauge->SetValue(0);
|
||||
|
||||
wxLogMessage(wxT("Stopped the timer."));
|
||||
}
|
||||
}
|
||||
|
@@ -193,8 +193,9 @@ wxSize wxGauge::DoGetBestSize() const
|
||||
|
||||
void wxGauge::SetRange(int r)
|
||||
{
|
||||
// switch to determinate mode if required
|
||||
SetDeterminateMode();
|
||||
// Changing range implicitly means we're using determinate mode.
|
||||
if ( IsInIndeterminateMode() )
|
||||
SetDeterminateMode();
|
||||
|
||||
m_rangeMax = r;
|
||||
|
||||
@@ -208,16 +209,16 @@ void wxGauge::SetRange(int r)
|
||||
|
||||
void wxGauge::SetValue(int pos)
|
||||
{
|
||||
// Setting the (same) position produces flicker on Vista,
|
||||
// especially noticable if ownerdrawn
|
||||
if (GetValue() == pos) return;
|
||||
// Setting the value implicitly means that we're using determinate mode.
|
||||
if ( IsInIndeterminateMode() )
|
||||
SetDeterminateMode();
|
||||
|
||||
// switch to determinate mode if required
|
||||
SetDeterminateMode();
|
||||
if ( GetValue() != pos )
|
||||
{
|
||||
m_gaugePos = pos;
|
||||
|
||||
m_gaugePos = pos;
|
||||
|
||||
::SendMessage(GetHwnd(), PBM_SETPOS, pos, 0);
|
||||
::SendMessage(GetHwnd(), PBM_SETPOS, pos, 0);
|
||||
}
|
||||
}
|
||||
|
||||
bool wxGauge::SetForegroundColour(const wxColour& col)
|
||||
@@ -240,24 +241,30 @@ bool wxGauge::SetBackgroundColour(const wxColour& col)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool wxGauge::IsInIndeterminateMode() const
|
||||
{
|
||||
return (::GetWindowLong(GetHwnd(), GWL_STYLE) & PBS_MARQUEE) != 0;
|
||||
}
|
||||
|
||||
void wxGauge::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
|
||||
// Switch the control into indeterminate mode if necessary.
|
||||
if ( !IsInIndeterminateMode() )
|
||||
{
|
||||
const long style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
|
||||
::SetWindowLong(GetHwnd(), GWL_STYLE, style | PBS_MARQUEE);
|
||||
::SendMessage(GetHwnd(), PBM_SETMARQUEE, TRUE, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void wxGauge::SetDeterminateMode()
|
||||
{
|
||||
// remove the PBS_MARQUEE style to the progress bar
|
||||
LONG style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
|
||||
if ((style & PBS_MARQUEE) != 0)
|
||||
if ( IsInIndeterminateMode() )
|
||||
{
|
||||
const long style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
|
||||
::SendMessage(GetHwnd(), PBM_SETMARQUEE, FALSE, 0);
|
||||
::SetWindowLong(GetHwnd(), GWL_STYLE, style & ~PBS_MARQUEE);
|
||||
|
||||
// now the control can only run in determinate mode
|
||||
}
|
||||
}
|
||||
|
||||
void wxGauge::Pulse()
|
||||
@@ -267,10 +274,7 @@ void wxGauge::Pulse()
|
||||
// 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);
|
||||
SendMessage(GetHwnd(), PBM_STEPIT, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Reference in New Issue
Block a user