Fix erasing wxHtmlWindow background in wxUniv.

Prevent the default wxWindow-level wxEVT_ERASE_BACKGROUND handler from being
used in wxUniv for wxHtmlWindow. This is unnecessary as it has its own handler
anyhow and also doesn't work for some reason as erasing wxMemoryDC by drawing
a solid rectangle over it seems to be broken in at least wxX11.

Work around this problem by erasing the background in wxHtmlWindow itself if
no user-defined (as opposed to any, including one defined in wxWindow itself)
handler for this event exists.

Closes #13880.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71300 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2012-04-28 22:24:43 +00:00
parent 4fbb421ba9
commit 49b489e80f
2 changed files with 28 additions and 3 deletions

View File

@ -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;

View File

@ -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)