X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/66a586557672f11b9fe888f4ad9f3b8fc0583b6f..4e5a4c69c540b430fba8efe5dae1bc1ffd5caeca:/src/univ/winuniv.cpp diff --git a/src/univ/winuniv.cpp b/src/univ/winuniv.cpp index 33de114721..be8a2ba4e3 100644 --- a/src/univ/winuniv.cpp +++ b/src/univ/winuniv.cpp @@ -108,6 +108,9 @@ void wxWindow::Init() m_isCurrent = FALSE; m_renderer = wxTheme::Get()->GetRenderer(); + + m_oldSize.x = -1; + m_oldSize.y = -1; } bool wxWindow::Create(wxWindow *parent, @@ -129,9 +132,15 @@ bool wxWindow::Create(wxWindow *parent, // if we should always have the scrollbar, do show it if ( GetWindowStyle() & wxALWAYS_SHOW_SB ) { +#if wxUSE_TWO_WINDOWS + SetInsertIntoMain( TRUE ); +#endif m_scrollbarVert = new wxScrollBar(this, -1, wxDefaultPosition, wxDefaultSize, wxSB_VERTICAL); +#if wxUSE_TWO_WINDOWS + SetInsertIntoMain( FALSE ); +#endif // and position it PositionScrollbars(); @@ -180,7 +189,7 @@ void wxWindow::OnErase(wxEraseEvent& event) return; } - + DoDrawBackground(*event.GetDC()); // if we have both scrollbars, we also have a square in the corner between @@ -446,12 +455,114 @@ int wxWindow::GetStateFlags() const void wxWindow::OnSize(wxSizeEvent& event) { + event.Skip(); + if ( m_scrollbarVert || m_scrollbarHorz ) { PositionScrollbars(); } - - event.Skip(); + +#if 0 // ndef __WXMSW__ + // Refresh the area (strip) previously occupied by the border + + if (HasFlag( wxNO_FULL_REPAINT_ON_RESIZE ) && IsShown()) + { + // This code assumes that wxSizeEvent.GetSize() returns + // the area of the entire window, not just the client + // area. + wxSize newSize = event.GetSize(); + + if (m_oldSize.x == -1 && m_oldSize.y == -1) + { + m_oldSize = newSize; + return; + } + + if (HasFlag( wxSIMPLE_BORDER )) + { + if (newSize.y > m_oldSize.y) + { + wxRect rect; + rect.x = 0; + rect.width = m_oldSize.x; + rect.y = m_oldSize.y-2; + rect.height = 1; + Refresh( TRUE, &rect ); + } + else if (newSize.y < m_oldSize.y) + { + wxRect rect; + rect.y = newSize.y; + rect.x = 0; + rect.height = 1; + rect.width = newSize.x; + wxWindowNative::Refresh( TRUE, &rect ); + } + + if (newSize.x > m_oldSize.x) + { + wxRect rect; + rect.y = 0; + rect.height = m_oldSize.y; + rect.x = m_oldSize.x-2; + rect.width = 1; + Refresh( TRUE, &rect ); + } + else if (newSize.x < m_oldSize.x) + { + wxRect rect; + rect.x = newSize.x; + rect.y = 0; + rect.width = 1; + rect.height = newSize.y; + wxWindowNative::Refresh( TRUE, &rect ); + } + } + else + if (HasFlag( wxSUNKEN_BORDER ) || HasFlag( wxRAISED_BORDER )) + { + if (newSize.y > m_oldSize.y) + { + wxRect rect; + rect.x = 0; + rect.width = m_oldSize.x; + rect.y = m_oldSize.y-4; + rect.height = 2; + Refresh( TRUE, &rect ); + } + else if (newSize.y < m_oldSize.y) + { + wxRect rect; + rect.y = newSize.y; + rect.x = 0; + rect.height = 2; + rect.width = newSize.x; + wxWindowNative::Refresh( TRUE, &rect ); + } + + if (newSize.x > m_oldSize.x) + { + wxRect rect; + rect.y = 0; + rect.height = m_oldSize.y; + rect.x = m_oldSize.x-4; + rect.width = 2; + Refresh( TRUE, &rect ); + } + else if (newSize.x < m_oldSize.x) + { + wxRect rect; + rect.x = newSize.x; + rect.y = 0; + rect.width = 2; + rect.height = newSize.y; + wxWindowNative::Refresh( TRUE, &rect ); + } + } + + m_oldSize = newSize; + } +#endif } wxSize wxWindow::DoGetBestSize() const @@ -476,8 +587,11 @@ wxPoint wxWindow::GetClientAreaOrigin() const { wxPoint pt = wxWindowBase::GetClientAreaOrigin(); +#if wxUSE_TWO_WINDOWS +#else if ( m_renderer ) pt += m_renderer->GetBorderDimensions(GetBorder()).GetPosition(); +#endif return pt; } @@ -666,10 +780,16 @@ void wxWindow::SetScrollbar(int orient, if ( !scrollbar ) { // create it +#if wxUSE_TWO_WINDOWS + SetInsertIntoMain( TRUE ); +#endif scrollbar = new wxScrollBar(this, -1, wxDefaultPosition, wxDefaultSize, orient & wxVERTICAL ? wxSB_VERTICAL : wxSB_HORIZONTAL); +#if wxUSE_TWO_WINDOWS + SetInsertIntoMain( FALSE ); +#endif if ( orient & wxVERTICAL ) m_scrollbarVert = scrollbar; else @@ -795,8 +915,32 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect) node; node = node->GetNext()) { wxWindow *child = node->GetData(); - if ( child != m_scrollbarVert && child != m_scrollbarHorz && - (rect == NULL || rect->Intersects(child->GetRect())) ) + if ( child == m_scrollbarVert || child == m_scrollbarHorz ) + continue; + + // VS: Scrolling children has non-trivial semantics. If rect=NULL then + // it is easy: we scroll all children. Otherwise it gets + // complicated: + // 1. if scrolling in one direction only, scroll only + // those children that intersect shaft defined by the rectangle + // and scrolling direction + // 2. if scrolling in both axes, scroll all children + + if ( rect && (dx * dy == 0 /* moving in only one of x, y axis */) ) + { + wxRect childRect = child->GetRect(); + if ( dx == 0 && (childRect.GetLeft() <= rect->GetRight() || + childRect.GetRight() >= rect->GetLeft()) ) + { + child->Move(child->GetPosition() + offset); + } + else if ( dy == 0 && (childRect.GetTop() <= rect->GetBottom() || + childRect.GetBottom() >= rect->GetTop()) ) + { + child->Move(child->GetPosition() + offset); + } + } + else { child->Move(child->GetPosition() + offset); }