From 03d4194d6b4e2176a213c1fc8651454e3b9edcc8 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 15 Mar 2008 04:10:43 +0000 Subject: [PATCH] implement wxSpinCtrl::Reparent() to properly reparent both the spin button and the text control part (slightly modified patch 1914190) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52543 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/generic/spinctlg.h | 1 + include/wx/msw/spinctrl.h | 2 ++ src/generic/spinctlg.cpp | 11 ++++++++++ src/msw/spinctrl.cpp | 40 +++++++++++++++++++++++++++++++++++ 5 files changed, 55 insertions(+) diff --git a/docs/changes.txt b/docs/changes.txt index ecb672e289..75c85fa136 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -288,6 +288,7 @@ All (GUI): - Added wxWindow::HasFocus(). - Added wxGLCanvas::IsDisplaySupported(). - Added wxApp::SetNativeTheme() (Stefan H.). +- Made wxSpinCtrl::Reparent() in MSW and generic versions (Angelo Mottola) wxGTK: diff --git a/include/wx/generic/spinctlg.h b/include/wx/generic/spinctlg.h index 9d4f63f7fe..e607f6009d 100644 --- a/include/wx/generic/spinctlg.h +++ b/include/wx/generic/spinctlg.h @@ -74,6 +74,7 @@ public: // forward these functions to all subcontrols virtual bool Enable(bool enable = true); virtual bool Show(bool show = true); + virtual bool Reparent(wxWindow *newParent); // get the subcontrols wxTextCtrl *GetText() const { return m_text; } diff --git a/include/wx/msw/spinctrl.h b/include/wx/msw/spinctrl.h index cf94fe18a3..94f78810a1 100644 --- a/include/wx/msw/spinctrl.h +++ b/include/wx/msw/spinctrl.h @@ -73,6 +73,8 @@ public: virtual bool Enable(bool enable = true); virtual bool Show(bool show = true); + virtual bool Reparent(wxWindowBase *newParent); + // wxSpinButton doesn't accept focus, but we do virtual bool AcceptsFocus() const { return wxWindow::AcceptsFocus(); } diff --git a/src/generic/spinctlg.cpp b/src/generic/spinctlg.cpp index 88de174cfd..9103305144 100644 --- a/src/generic/spinctlg.cpp +++ b/src/generic/spinctlg.cpp @@ -265,6 +265,17 @@ bool wxSpinCtrl::Show(bool show) return true; } +bool wxSpinCtrl::Reparent(wxWindow *newParent) +{ + if ( m_btn ) + { + m_btn->Reparent(newParent); + m_text->Reparent(newParent); + } + + return true; +} + // ---------------------------------------------------------------------------- // value and range access // ---------------------------------------------------------------------------- diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index c5644f4dfc..e5a4577acf 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -537,6 +537,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) ) -- 2.45.2