diff --git a/include/wx/msw/spinctrl.h b/include/wx/msw/spinctrl.h index edcb026f76..2a5f56f5c0 100644 --- a/include/wx/msw/spinctrl.h +++ b/include/wx/msw/spinctrl.h @@ -99,14 +99,22 @@ protected: // the handler for wxSpinButton events void OnSpinChange(wxSpinEvent& event); - // Handle processing of special keys + // handle processing of special keys void OnChar(wxKeyEvent& event); void OnSetFocus(wxFocusEvent& event); void OnKillFocus(wxFocusEvent& event); - int m_oldValue; + // generate spin control update event with the given value + void SendSpinUpdate(int value); + + // called to ensure that the value is in the correct range virtual void NormalizeValue(); - + + + // the value of the control before the latest change (which might not have + // changed anything in fact -- this is why we need this field) + int m_oldValue; + // the data for the "buddy" text ctrl WXHWND m_hwndBuddy; WXFARPROC m_wndProcBuddy; diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index a8882e4043..6651f614ac 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -269,7 +269,7 @@ void wxSpinCtrl::OnSetFocus(wxFocusEvent& event) void wxSpinCtrl::NormalizeValue() { const int value = GetValue(); - const bool changed = value == m_oldValue; + const bool changed = value != m_oldValue; // notice that we have to call SetValue() even if the value didn't change // because otherwise we could be left with empty buddy control when value @@ -278,11 +278,7 @@ void wxSpinCtrl::NormalizeValue() if ( changed ) { - wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, GetId()); - event.SetEventObject(this); - event.SetInt(value); - GetEventHandler()->ProcessEvent(event); - m_oldValue = value; + SendSpinUpdate(value); } } @@ -299,6 +295,11 @@ bool wxSpinCtrl::Create(wxWindow *parent, int min, int max, int initial, const wxString& name) { + // this should be in ctor/init function but I don't want to add one to 2.8 + // to avoid problems with default ctor which can be inlined in the user + // code and so might not get this fix without recompilation + m_oldValue = INT_MIN; + // before using DoGetBestSize(), have to set style to let the base class // know whether this is a horizontal or vertical control (we're always // vertical) @@ -546,27 +547,29 @@ void wxSpinCtrl::DoSetToolTip(wxToolTip *tip) #endif // wxUSE_TOOLTIPS // ---------------------------------------------------------------------------- -// event processing +// events processing and generation // ---------------------------------------------------------------------------- -void wxSpinCtrl::OnSpinChange(wxSpinEvent& eventSpin) +void wxSpinCtrl::SendSpinUpdate(int value) { wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, GetId()); event.SetEventObject(this); - int value = eventSpin.GetPosition(); - event.SetInt( value ); + event.SetInt(value); - if (value != m_oldValue) - (void)GetEventHandler()->ProcessEvent(event); - - if ( eventSpin.GetSkipped() ) - { - event.Skip(); - } + (void)GetEventHandler()->ProcessEvent(event); m_oldValue = value; } +void wxSpinCtrl::OnSpinChange(wxSpinEvent& eventSpin) +{ + const int value = eventSpin.GetPosition(); + if ( value != m_oldValue ) + { + SendSpinUpdate(value); + } +} + // ---------------------------------------------------------------------------- // size calculations // ----------------------------------------------------------------------------