// 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();
// painting
// ----------------------------------------------------------------------------
-// the event handler executed when the window background must be painted
-void wxWindow::OnErase(wxEraseEvent& event)
-{
- if ( !m_renderer )
- {
- event.Skip();
-
- return;
- }
-
- DoDrawBackground(*event.GetDC());
-
- // if we have both scrollbars, we also have a square in the corner between
- // them which we must paint
- if ( m_scrollbarVert && m_scrollbarHorz )
- {
- wxSize size = GetSize();
- wxRect rectClient = GetClientRect(),
- rectBorder = m_renderer->GetBorderDimensions(GetBorder());
-
- wxRect rectCorner;
- rectCorner.x = rectClient.GetRight() + 1;
- rectCorner.y = rectClient.GetBottom() + 1;
- rectCorner.SetRight(size.x - rectBorder.width);
- rectCorner.SetBottom(size.y - rectBorder.height);
-
- if ( GetUpdateRegion().Contains(rectCorner) )
- {
- m_renderer->DrawScrollCorner(*event.GetDC(), rectCorner);
- }
- }
-}
-
// the event handlers executed when the window must be repainted
void wxWindow::OnNcPaint(wxPaintEvent& event)
{
}
}
+// the event handler executed when the window background must be painted
+void wxWindow::OnErase(wxEraseEvent& event)
+{
+ if ( !m_renderer )
+ {
+ event.Skip();
+
+ return;
+ }
+
+ DoDrawBackground(*event.GetDC());
+
+ // if we have both scrollbars, we also have a square in the corner between
+ // them which we must paint
+ if ( m_scrollbarVert && m_scrollbarHorz )
+ {
+ wxSize size = GetSize();
+ wxRect rectClient = GetClientRect(),
+ rectBorder = m_renderer->GetBorderDimensions(GetBorder());
+
+ wxRect rectCorner;
+ rectCorner.x = rectClient.GetRight() + 1;
+ rectCorner.y = rectClient.GetBottom() + 1;
+ rectCorner.SetRight(size.x - rectBorder.width);
+ rectCorner.SetBottom(size.y - rectBorder.height);
+
+ if ( GetUpdateRegion().Contains(rectCorner) )
+ {
+ m_renderer->DrawScrollCorner(*event.GetDC(), rectCorner);
+ }
+ }
+}
+
bool wxWindow::DoDrawBackground(wxDC& dc)
{
- // FIXME: leaving this code in leads to partial bg redraws sometimes under
- // MSW
wxRect rect;
-#ifndef __WXMSW__
- rect = GetUpdateRegion().GetBox();
- if ( !rect.width && !rect.height )
-#endif
+
+ wxSize size = GetSize(); // Why not GetClientSize() ?
+ rect.x = 0;
+ rect.y = 0;
+ rect.width = size.x;
+ rect.height = size.y;
+
+ if (HasTransparentBackground() && GetParent() && GetParent()->ProvidesBackground())
{
- wxSize size = GetSize();
- rect.width = size.x;
- rect.height = size.y;
+ wxASSERT( !IsTopLevel() );
+
+ wxPoint pos = GetPosition();
+
+ AdjustForParentClientOrigin( pos.x, pos.y, 0 );
+
+ // Adjust DC logical origin
+ wxCoord x,y;
+ dc.GetLogicalOrigin( &x, &y );
+ x += pos.x;
+ y += pos.y;
+ dc.SetLogicalOrigin( x, y );
+
+ // Adjust draw rect
+ rect.x = pos.x;
+ rect.y = pos.y;
+
+ // Let parent draw the background
+ GetParent()->EraseBackground( dc, rect );
}
+ else
+ {
+ // Draw background ouselves
+ EraseBackground( dc, rect );
+ }
+
+ return TRUE;
+}
+void wxWindow::EraseBackground(wxDC& dc, const wxRect& rect)
+{
if ( GetBackgroundBitmap().Ok() )
{
- // get the bitmap and the flags
+ // Get the bitmap and the flags
int alignment;
wxStretch stretch;
wxBitmap bmp = GetBackgroundBitmap(&alignment, &stretch);
wxControlRenderer::DrawBitmap(dc, bmp, rect, alignment, stretch);
}
- else // just fill it with bg colour if no bitmap
+ else
{
+ // Just fill it with bg colour if no bitmap
+
m_renderer->DrawBackground(dc, wxTHEME_BG_COLOUR(this),
rect, GetStateFlags());
}
-
- return TRUE;
-}
-
-void wxWindow::EraseBackground(wxDC& dc, const wxRect& rect)
-{
- // TODO: handle bg bitmaps here!
-
- m_renderer->DrawBackground(dc, wxTHEME_BG_COLOUR(this), rect, GetStateFlags());
}
void wxWindow::DoDrawBorder(wxDC& dc, const wxRect& rect)
PositionScrollbars();
}
-#ifndef __WXMSW__
+#if 0 // ndef __WXMSW__
// Refresh the area (strip) previously occupied by the border
if (HasFlag( wxNO_FULL_REPAINT_ON_RESIZE ) && IsShown())
{
wxPoint pt = wxWindowBase::GetClientAreaOrigin();
+#if wxUSE_TWO_WINDOWS
+#else
if ( m_renderer )
pt += m_renderer->GetBorderDimensions(GetBorder()).GetPosition();
+#endif
return pt;
}
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
// give the window a chance to relayout
if ( hasClientSizeChanged )
{
+#if wxUSE_TWO_WINDOWS
+ wxWindowNative::SetSize( GetSize() );
+#else
wxSizeEvent event(GetSize());
(void)GetEventHandler()->ProcessEvent(event);
+#endif
}
}