diff --git a/include/wx/html/htmlwin.h b/include/wx/html/htmlwin.h index 580dbbca9b..b95e7d6267 100644 --- a/include/wx/html/htmlwin.h +++ b/include/wx/html/htmlwin.h @@ -403,6 +403,7 @@ protected: void CreateLayout(); void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); void OnSize(wxSizeEvent& event); void OnMouseMove(wxMouseEvent& event); void OnMouseDown(wxMouseEvent& event); @@ -545,6 +546,10 @@ private: // if this FLAG is false, items are not added to history bool m_HistoryOn; + // Flag used to communicate between OnPaint() and OnEraseBackground(), see + // the comments near its use. + bool m_isBgReallyErased; + // standard mouse cursors static wxCursor *ms_cursorLink; static wxCursor *ms_cursorText; diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp index 7496fa4fd1..22ac09f009 100644 --- a/src/html/htmlwin.cpp +++ b/src/html/htmlwin.cpp @@ -1102,6 +1102,19 @@ void wxHtmlWindow::DoEraseBackground(wxDC& dc) } } +void wxHtmlWindow::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) +{ + // We never get real erase background events as we changed our background + // style to wxBG_STYLE_PAINT in our ctor so the only time when we get here + // is when an artificial wxEraseEvent is generated by our own OnPaint() + // below. This handler only exists to stop the event from propagating + // downwards to wxWindow which may erase the background itself when it gets + // it in some ports (currently this happens in wxUniv), so we simply stop + // processing here and set a special flag allowing OnPaint() to see that + // the event hadn't been really processed. + m_isBgReallyErased = false; +} + void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dcPaint(this); @@ -1134,11 +1147,17 @@ void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) PrepareDC(*dc); - // erase the background: for compatibility, we must generate the event to - // allow the user-defined handlers to do it + // Erase the background: for compatibility, we must generate the event to + // allow the user-defined handlers to do it, hence this hack with sending + // an artificial wxEraseEvent to trigger the execution of such handlers. wxEraseEvent eraseEvent(GetId(), dc); eraseEvent.SetEventObject(this); - if ( !ProcessWindowEvent(eraseEvent) ) + + // Hack inside a hack: the background wasn't really erased if our own + // OnEraseBackground() was executed, so we need to check for the flag set + // by it whenever it's called. + m_isBgReallyErased = true; // Initially assume it wasn't. + if ( !ProcessWindowEvent(eraseEvent) || !m_isBgReallyErased ) { // erase background ourselves DoEraseBackground(*dc); @@ -1669,6 +1688,7 @@ BEGIN_EVENT_TABLE(wxHtmlWindow, wxScrolledWindow) EVT_RIGHT_UP(wxHtmlWindow::OnMouseUp) EVT_MOTION(wxHtmlWindow::OnMouseMove) EVT_PAINT(wxHtmlWindow::OnPaint) + EVT_ERASE_BACKGROUND(wxHtmlWindow::OnEraseBackground) #if wxUSE_CLIPBOARD EVT_LEFT_DCLICK(wxHtmlWindow::OnDoubleClick) EVT_ENTER_WINDOW(wxHtmlWindow::OnMouseEnter)