X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b7527dde394466affd11a1119b030bcd985fd089..6c2cd2a2116c5eff1646e0acb7cad2c887300300:/src/msw/spinctrl.cpp diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index 2a1826c45a..73fb437fc0 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -148,8 +148,7 @@ LRESULT APIENTRY _EXPORT wxBuddyTextWndProc(HWND hwnd, { wxSpinCtrl *spin = (wxSpinCtrl *)wxGetWindowUserData(hwnd); - // forward some messages (the key and focus ones only so far) to - // the spin ctrl + // forward some messages (mostly the key and focus ones) to the spin ctrl switch ( message ) { case WM_SETFOCUS: @@ -164,6 +163,12 @@ LRESULT APIENTRY _EXPORT wxBuddyTextWndProc(HWND hwnd, case WM_DEADCHAR: case WM_KEYUP: case WM_KEYDOWN: +#ifdef WM_HELP + // we need to forward WM_HELP too to ensure that the context help + // associated with wxSpinCtrl is shown when the text control part of it + // is clicked with the "?" cursor + case WM_HELP: +#endif spin->MSWWindowProc(message, wParam, lParam); // The control may have been deleted at this point, so check. @@ -173,7 +178,7 @@ LRESULT APIENTRY _EXPORT wxBuddyTextWndProc(HWND hwnd, case WM_GETDLGCODE: // we want to get WXK_RETURN in order to generate the event for it - return DLGC_WANTCHARS; + return DLGC_WANTALLKEYS; } return ::CallWindowProc(CASTWNDPROC spin->GetBuddyWndProc(), @@ -200,7 +205,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); @@ -296,6 +301,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 @@ -457,6 +464,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 @@ -472,6 +481,8 @@ void wxSpinCtrl::SetValue(int val) } m_oldValue = GetValue(); + + m_blockEvent = false; } int wxSpinCtrl::GetValue() const @@ -532,6 +543,46 @@ bool wxSpinCtrl::Show(bool show) return true; } +bool wxSpinCtrl::Reparent(wxWindowBase *newParent) +{ + // Reparenting both the updown control and its buddy does not seem to work: + // they continue to be connected somehow, but visually there is no feedback + // on the buddy edit control. To avoid this problem, we reparent the buddy + // window normally, but we recreate the updown control and reassign its + // buddy. + + if ( !wxWindowBase::Reparent(newParent) ) + return false; + + newParent->GetChildren().DeleteObject(this); + + // preserve the old values + const wxSize size = GetSize(); + int value = GetValue(); + const wxRect btnRect = wxRectFromRECT(wxGetWindowRect(GetHwnd())); + + // destroy the old spin button + UnsubclassWin(); + if ( !::DestroyWindow(GetHwnd()) ) + wxLogLastError(wxT("DestroyWindow")); + + // create and initialize the new one + if ( !wxSpinButton::Create(GetParent(), GetId(), + btnRect.GetPosition(), btnRect.GetSize(), + GetWindowStyle(), GetName()) ) + return false; + + SetValue(value); + SetRange(m_min, m_max); + SetInitialSize(size); + + // associate it with the buddy control again + ::SetParent(GetBuddyHwnd(), GetHwndOf(GetParent())); + (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)GetBuddyHwnd(), 0); + + return true; +} + bool wxSpinCtrl::Enable(bool enable) { if ( !wxControl::Enable(enable) )