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)