Reposition wxSpinCtrl correctly after reparenting it in wxMSW.

The position of wxSpinCtrl after reparenting was wrong because we didn't
remember the old position early enough.

There also was a more minor bug which resulted in the position not being set
correctly if (any of its components) was -1 before reparenting.

Closes #12633.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65966 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-10-31 11:37:31 +00:00
parent bc73fe96a2
commit 03263ff73b

View File

@@ -594,16 +594,15 @@ bool wxSpinCtrl::Reparent(wxWindowBase *newParent)
// window normally, but we recreate the updown control and reassign its
// buddy.
// Get the position before changing the parent as it would be offset after
// changing it.
const wxRect rect = GetRect();
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 after detaching it from this wxWindow object
// (notice that m_hWnd will be reset by UnsubclassWin() so save it first)
const HWND hwndOld = GetHwnd();
@@ -615,13 +614,17 @@ bool wxSpinCtrl::Reparent(wxWindowBase *newParent)
// create and initialize the new one
if ( !wxSpinButton::Create(GetParent(), GetId(),
btnRect.GetPosition(), btnRect.GetSize(),
rect.GetPosition(), rect.GetSize(),
GetWindowStyle(), GetName()) )
return false;
SetValue(value);
// reapply our values to wxSpinButton
wxSpinButton::SetValue(GetValue());
SetRange(m_min, m_max);
SetInitialSize(size);
// also set the size again with wxSIZE_ALLOW_MINUS_ONE flag: this is
// necessary if our original position used -1 for either x or y
SetSize(rect, wxSIZE_ALLOW_MINUS_ONE);
// associate it with the buddy control again
::SetParent(GetBuddyHwnd(), GetHwndOf(GetParent()));