X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6ef4b814d2184bb7f85073e2ce8cb0e35151b45e..6fef2483d9dc1a7c006d2f5967791e0f4c0cf518:/src/univ/winuniv.cpp diff --git a/src/univ/winuniv.cpp b/src/univ/winuniv.cpp index 631b7e8800..7485272ce9 100644 --- a/src/univ/winuniv.cpp +++ b/src/univ/winuniv.cpp @@ -124,20 +124,26 @@ bool wxWindow::Create(wxWindow *parent, { long actualStyle = style; - // FIXME: may need this on other platforms -#ifdef __WXMSW__ + // we add wxCLIP_CHILDREN to get the same ("natural") behaviour under MSW + // as under the other platforms + actualStyle |= wxCLIP_CHILDREN; + actualStyle &= ~wxVSCROLL; actualStyle &= ~wxHSCROLL; + +#ifdef __WXMSW__ + // without this, borders (non-client areas in general) are not repainted + // correctly when resizing; apparently, native NC areas are fully repainted + // even without this style by MSW, but wxUniv implements client area + // itself, so it doesn't work correctly for us + // + // FIXME: this is very expensive, we need to fix the (commented-out) code + // in OnSize() instead + actualStyle |= wxFULL_REPAINT_ON_RESIZE; #endif - // we add wxCLIP_CHILDREN to get the same ("natural") behaviour under MSW - // as under the other platforms - if ( !wxWindowNative::Create(parent, id, pos, size, - actualStyle | wxCLIP_CHILDREN, - name) ) - { + if ( !wxWindowNative::Create(parent, id, pos, size, actualStyle, name) ) return false; - } // Set full style again, including those we didn't want present // when calling the base window Create(). @@ -190,6 +196,14 @@ wxWindow::~wxWindow() { m_isBeingDeleted = true; +#if wxUSE_SCROLLBAR + // clear pointers to scrollbar before deleting the children: they are + // children and so will be deleted by DestroyChildren() call below and if + // any code using the scrollbars would be called in the process or from + // ~wxWindowBase, the app would crash: + m_scrollbarVert = m_scrollbarHorz = NULL; +#endif + // we have to destroy our children before we're destroyed because our // children suppose that we're of type wxWindow, not just wxWindowNative, // and so bad things may happen if they're deleted from the base class dtor @@ -720,8 +734,6 @@ void wxWindow::DoGetClientSize(int *width, int *height) const if ( m_renderer ) rectBorder = m_renderer->GetBorderDimensions(GetBorder()); - bool inside = m_renderer->AreScrollbarsInsideBorder(); - if ( width ) { #if wxUSE_SCROLLBAR @@ -730,17 +742,8 @@ void wxWindow::DoGetClientSize(int *width, int *height) const w -= m_scrollbarVert->GetSize().x; #endif // wxUSE_SCROLLBAR - // if we don't have scrollbar or if it is outside the border (and not - // blended into it), take account of the right border as well - if ( -#if wxUSE_SCROLLBAR - !m_scrollbarVert || -#endif // wxUSE_SCROLLBAR - inside ) - w -= rectBorder.width; - - // and always account for the left border - *width = w - rectBorder.x; + // account for the left and right borders + *width = w - rectBorder.x - rectBorder.width; // we shouldn't return invalid width if ( *width < 0 ) @@ -754,14 +757,7 @@ void wxWindow::DoGetClientSize(int *width, int *height) const h -= m_scrollbarHorz->GetSize().y; #endif // wxUSE_SCROLLBAR - if ( -#if wxUSE_SCROLLBAR - !m_scrollbarHorz || -#endif // wxUSE_SCROLLBAR - inside ) - h -= rectBorder.height; - - *height = h - rectBorder.y; + *height = h - rectBorder.y - rectBorder.height; // we shouldn't return invalid height if ( *height < 0 ) @@ -779,29 +775,18 @@ void wxWindow::DoSetClientSize(int width, int height) // and the scrollbars (as they may be offset into the border, use the // scrollbar position, not size - this supposes that PositionScrollbars() // had been called before) - bool inside = m_renderer->AreScrollbarsInsideBorder(); wxSize size = GetSize(); #if wxUSE_SCROLLBAR if ( m_scrollbarVert ) width += size.x - m_scrollbarVert->GetPosition().x; #endif // wxUSE_SCROLLBAR - if ( -#if wxUSE_SCROLLBAR - !m_scrollbarVert || -#endif // wxUSE_SCROLLBAR - inside ) - width += rectBorder.width; + width += rectBorder.width; #if wxUSE_SCROLLBAR if ( m_scrollbarHorz ) height += size.y - m_scrollbarHorz->GetPosition().y; #endif // wxUSE_SCROLLBAR - if ( -#if wxUSE_SCROLLBAR - !m_scrollbarHorz || -#endif // wxUSE_SCROLLBAR - inside ) - height += rectBorder.height; + height += rectBorder.height; wxWindowNative::DoSetClientSize(width, height); }