X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03d4194d6b4e2176a213c1fc8651454e3b9edcc8..5bf3b6fe48580853044132c381d3548535ca7ad1:/src/msw/spinctrl.cpp diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index e5a4577acf..d7a13374d0 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) @@ -177,8 +175,20 @@ LRESULT APIENTRY _EXPORT wxBuddyTextWndProc(HWND hwnd, break; case WM_GETDLGCODE: - // we want to get WXK_RETURN in order to generate the event for it - return DLGC_WANTCHARS; + if ( spin->HasFlag(wxTE_PROCESS_ENTER) ) + { + long dlgCode = ::CallWindowProc + ( + CASTWNDPROC spin->GetBuddyWndProc(), + hwnd, + message, + wParam, + lParam + ); + dlgCode |= DLGC_WANTMESSAGE; + return dlgCode; + } + break; } return ::CallWindowProc(CASTWNDPROC spin->GetBuddyWndProc(), @@ -205,7 +215,7 @@ wxSpinCtrl *wxSpinCtrl::GetSpinForTextCtrl(WXHWND hwndBuddy) // process a WM_COMMAND generated by the buddy text control bool wxSpinCtrl::ProcessTextCommand(WXWORD cmd, WXWORD WXUNUSED(id)) { - if ( cmd == EN_CHANGE ) + if ( (cmd == EN_CHANGE) && (!m_blockEvent )) { wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); event.SetEventObject(this); @@ -301,6 +311,8 @@ bool wxSpinCtrl::Create(wxWindow *parent, int min, int max, int initial, const wxString& name) { + m_blockEvent = false; + // 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 @@ -323,10 +335,16 @@ bool wxSpinCtrl::Create(wxWindow *parent, WXDWORD exStyle = 0; WXDWORD msStyle = MSWGetStyle(GetWindowStyle(), & exStyle) ; + // propagate text alignment style to text ctrl + if ( style & wxALIGN_RIGHT ) + msStyle |= ES_RIGHT; + else if ( style & wxALIGN_CENTER ) + msStyle |= ES_CENTER; + // this control is used for numeric entry so normally using these flags by // default shouldn't be a problem, if it is we can always add a style such // as wxSP_NON_NUMERIC later - msStyle |= ES_RIGHT | ES_NUMBER; + msStyle |= ES_NUMBER; // calculate the sizes: the size given is the total size for both controls // and we need to fit them both in the given width (height is the same) @@ -462,6 +480,8 @@ void wxSpinCtrl::SetValue(const wxString& text) void wxSpinCtrl::SetValue(int val) { + m_blockEvent = true; + wxSpinButton::SetValue(val); // normally setting the value of the spin button is enough as it updates @@ -477,6 +497,8 @@ void wxSpinCtrl::SetValue(int val) } m_oldValue = GetValue(); + + m_blockEvent = false; } int wxSpinCtrl::GetValue() const @@ -621,15 +643,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 // ----------------------------------------------------------------------------