Made MSW wxSpinCtrl emit UPDATE event when validating

the value in the text field upon kill focus.
 Documented this behaviour.
 This is in line with the GTK+ control.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41316 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2006-09-20 14:15:14 +00:00
parent 1a27de8838
commit 1e8dba5e29
5 changed files with 38 additions and 4 deletions

View File

@ -43,6 +43,12 @@ the corresponding events will not be generated under all platforms. Finally, if
the user modifies the text in the edit part of the spin control directly, the
{\tt EVT\_TEXT} is generated, like for the \helpref{wxTextCtrl}{wxtextctrl}.
When the use enters text into the text area, the text is not
validated until the control loses focus (e.g. by using the TAB
key). The value is then adjusted to the range and a
\helpref{wxSpinEvent}{wxspinevent} sent then if the value
is different from the last value sent.
\wxheading{See also}
\helpref{Event handling overview}{eventhandlingoverview},

View File

@ -61,7 +61,7 @@ protected:
virtual wxSize DoGetBestSize() const;
// ensure that the control displays a value in the current range
void NormalizeValue() { SetValue(GetValue()); }
virtual void NormalizeValue();
private:
DECLARE_DYNAMIC_CLASS_NO_COPY(wxSpinButton)

View File

@ -104,6 +104,9 @@ protected:
void OnSetFocus(wxFocusEvent& event);
void OnKillFocus(wxFocusEvent& event);
int m_oldValue;
virtual void NormalizeValue();
// the data for the "buddy" text ctrl
WXHWND m_hwndBuddy;
WXFARPROC m_wndProcBuddy;

View File

@ -256,6 +256,11 @@ void wxSpinButton::SetValue(int val)
}
}
void wxSpinButton::NormalizeValue()
{
SetValue( GetValue() );
}
void wxSpinButton::SetRange(int minVal, int maxVal)
{
const bool hadRange = m_min < m_max;

View File

@ -267,6 +267,20 @@ void wxSpinCtrl::OnSetFocus(wxFocusEvent& event)
event.Skip();
}
void wxSpinCtrl::NormalizeValue()
{
int value = GetValue();
SetValue( value );
if (value != m_oldValue)
{
wxCommandEvent event( wxEVT_COMMAND_SPINCTRL_UPDATED, GetId() );
event.SetEventObject( this );
event.SetInt( value );
GetEventHandler()->ProcessEvent( event );
m_oldValue = value;
}
}
// ----------------------------------------------------------------------------
// construction
// ----------------------------------------------------------------------------
@ -354,6 +368,8 @@ bool wxSpinCtrl::Create(wxWindow *parent,
SetRange(min, max);
SetValue(initial);
m_oldValue = initial;
// subclass the text ctrl to be able to intercept some events
wxSetWindowUserData(GetBuddyHwnd(), this);
@ -530,14 +546,18 @@ void wxSpinCtrl::OnSpinChange(wxSpinEvent& eventSpin)
{
wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, GetId());
event.SetEventObject(this);
event.SetInt(eventSpin.GetPosition());
(void)GetEventHandler()->ProcessEvent(event);
int value = eventSpin.GetPosition();
event.SetInt( value );
if (value != m_oldValue)
(void)GetEventHandler()->ProcessEvent(event);
if ( eventSpin.GetSkipped() )
{
event.Skip();
}
m_oldValue = value;
}
// ----------------------------------------------------------------------------