diff --git a/include/wx/msw/spinctrl.h b/include/wx/msw/spinctrl.h index d1707c703f..8f200c0267 100644 --- a/include/wx/msw/spinctrl.h +++ b/include/wx/msw/spinctrl.h @@ -99,8 +99,9 @@ protected: virtual void DoSetToolTip( wxToolTip *tip ); #endif // wxUSE_TOOLTIPS - // the handler for wxSpinButton events - void OnSpinChange(wxSpinEvent& event); + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + virtual bool MSWOnScroll(int orientation, WXWORD wParam, + WXWORD pos, WXHWND control); // handle processing of special keys void OnChar(wxKeyEvent& event); diff --git a/interface/spinctrl.h b/interface/spinctrl.h index af58fbcbcb..06d29a3647 100644 --- a/interface/spinctrl.h +++ b/interface/spinctrl.h @@ -94,12 +94,6 @@ public: /** Gets the value of the spin control. - - Notice that if you use this method from a handler processing a change - of the control value, it may return the old value, not the new one - (because the event handler can veto the change and this prevent the - value from changing at all). Use wxSpinEvent::GetValue() to retrieve - the new value in this case. */ int GetValue() const; diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index 73fb437fc0..20df40a30e 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -114,10 +114,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl, wxControl) BEGIN_EVENT_TABLE(wxSpinCtrl, wxSpinButton) EVT_CHAR(wxSpinCtrl::OnChar) - EVT_SET_FOCUS(wxSpinCtrl::OnSetFocus) EVT_KILL_FOCUS(wxSpinCtrl::OnKillFocus) - EVT_SPIN(wxID_ANY, wxSpinCtrl::OnSpinChange) END_EVENT_TABLE() #define GetBuddyHwnd() (HWND)(m_hwndBuddy) @@ -627,15 +625,37 @@ void wxSpinCtrl::SendSpinUpdate(int value) m_oldValue = value; } -void wxSpinCtrl::OnSpinChange(wxSpinEvent& eventSpin) +bool wxSpinCtrl::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam, + WXWORD pos, WXHWND control) { - const int value = eventSpin.GetPosition(); - if ( value != m_oldValue ) + wxCHECK_MSG( control, false, wxT("scrolling what?") ); + + if ( wParam != SB_THUMBPOSITION ) { - SendSpinUpdate(value); + // probable SB_ENDSCROLL - we don't react to it + return false; } + + int new_value = (short) pos; + if (m_oldValue != new_value) + SendSpinUpdate( new_value ); + + return TRUE; } +bool wxSpinCtrl::MSWOnNotify(int WXUNUSED(idCtrl), WXLPARAM lParam, WXLPARAM *result) +{ + NM_UPDOWN *lpnmud = (NM_UPDOWN *)lParam; + + if (lpnmud->hdr.hwndFrom != GetHwnd()) // make sure it is the right control + return false; + + *result = 0; // never reject UP and DOWN events + + return TRUE; +} + + // ---------------------------------------------------------------------------- // size calculations // ----------------------------------------------------------------------------