wxHtmlWindow background drawing fixes for OS X and optimizations

1. Avoid crashes under OS X due to attempts to copy window contents to the
   backing store bitmap: this doesn't work under OS X so avoid it by always
   painting the background from OnPaint() itself, while still generating the
   erase background events for compatibility.

2. Don't double buffer wxHtmlWindow drawing if the window is already double
   buffered.

3. Don't allocate backing store bitmap on the heap, this is useless as bitmaps
   are already pointer-lile -- so just use invalid bitmap instead of NULL
   bitmap pointer.

4. Update the html/test sample to show the effects of custom erase background
   handler in wxHtmlWindow (it overrides the background bitmap painting).



git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61117 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-06-18 17:32:20 +00:00
parent 86ac84b8ce
commit 03a187ccae
3 changed files with 147 additions and 81 deletions

View File

@@ -49,18 +49,32 @@ public:
class MyHtmlWindow : public wxHtmlWindow
{
public:
MyHtmlWindow(wxWindow *parent) : wxHtmlWindow( parent ) { }
MyHtmlWindow(wxWindow *parent) : wxHtmlWindow( parent )
{
// no custom background initially to avoid confusing people
m_drawCustomBg = false;
}
virtual wxHtmlOpeningStatus OnOpeningURL(wxHtmlURLType WXUNUSED(type),
const wxString& WXUNUSED(url),
wxString *WXUNUSED(redirect)) const;
private:
void OnClipboardEvent(wxClipboardTextEvent& event);
// toggle drawing of custom background
void DrawCustomBg(bool draw)
{
m_drawCustomBg = draw;
Refresh();
}
private:
#if wxUSE_CLIPBOARD
DECLARE_EVENT_TABLE()
void OnClipboardEvent(wxClipboardTextEvent& event);
#endif // wxUSE_CLIPBOARD
void OnEraseBgEvent(wxEraseEvent& event);
bool m_drawCustomBg;
DECLARE_EVENT_TABLE()
wxDECLARE_NO_COPY_CLASS(MyHtmlWindow);
};
@@ -79,6 +93,7 @@ public:
void OnBack(wxCommandEvent& event);
void OnForward(wxCommandEvent& event);
void OnProcessor(wxCommandEvent& event);
void OnDrawCustomBg(wxCommandEvent& event);
void OnHtmlLinkClicked(wxHtmlLinkEvent& event);
void OnHtmlCellHover(wxHtmlCellEvent &event);
@@ -121,7 +136,8 @@ enum
ID_DefaultWebBrowser,
ID_Back,
ID_Forward,
ID_Processor
ID_Processor,
ID_DrawCustomBg
};
// ----------------------------------------------------------------------------
@@ -136,6 +152,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Back, MyFrame::OnBack)
EVT_MENU(ID_Forward, MyFrame::OnForward)
EVT_MENU(ID_Processor, MyFrame::OnProcessor)
EVT_MENU(ID_DrawCustomBg, MyFrame::OnDrawCustomBg)
EVT_HTML_LINK_CLICKED(wxID_ANY, MyFrame::OnHtmlLinkClicked)
EVT_HTML_CELL_HOVER(wxID_ANY, MyFrame::OnHtmlCellHover)
@@ -199,7 +216,8 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
menuFile->AppendSeparator();
menuFile->Append(ID_Processor, _("&Remove bold attribute"),
wxEmptyString, wxITEM_CHECK);
menuFile->AppendSeparator();
menuFile->AppendCheckItem(ID_DrawCustomBg, "&Draw custom background");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT, _("&Close frame"));
menuNav->Append(ID_Back, _("Go &BACK"));
@@ -323,6 +341,11 @@ void MyFrame::OnProcessor(wxCommandEvent& WXUNUSED(event))
m_Html->LoadPage(m_Html->GetOpenedPage());
}
void MyFrame::OnDrawCustomBg(wxCommandEvent& event)
{
m_Html->DrawCustomBg(event.IsChecked());
}
void MyFrame::OnHtmlLinkClicked(wxHtmlLinkEvent &event)
{
wxLogMessage(wxT("The url '%s' has been clicked!"), event.GetLinkInfo().GetHref().c_str());
@@ -355,11 +378,14 @@ wxHtmlOpeningStatus MyHtmlWindow::OnOpeningURL(wxHtmlURLType WXUNUSED(type),
return wxHTML_OPEN;
}
#if wxUSE_CLIPBOARD
BEGIN_EVENT_TABLE(MyHtmlWindow, wxHtmlWindow)
#if wxUSE_CLIPBOARD
EVT_TEXT_COPY(wxID_ANY, MyHtmlWindow::OnClipboardEvent)
#endif // wxUSE_CLIPBOARD
EVT_ERASE_BACKGROUND(MyHtmlWindow::OnEraseBgEvent)
END_EVENT_TABLE()
#if wxUSE_CLIPBOARD
void MyHtmlWindow::OnClipboardEvent(wxClipboardTextEvent& WXUNUSED(event))
{
// explicitly call wxHtmlWindow::CopySelection() method
@@ -385,3 +411,30 @@ void MyHtmlWindow::OnClipboardEvent(wxClipboardTextEvent& WXUNUSED(event))
wxLogStatus(_T("Clipboard: nothing"));
}
#endif // wxUSE_CLIPBOARD
void MyHtmlWindow::OnEraseBgEvent(wxEraseEvent& event)
{
if ( !m_drawCustomBg )
{
event.Skip();
return;
}
// draw a background grid to show that this handler is indeed executed
wxDC& dc = *event.GetDC();
dc.SetPen(*wxBLUE_PEN);
dc.Clear();
const wxSize size = GetVirtualSize();
for ( int x = 0; x < size.x; x += 15 )
{
dc.DrawLine(x, 0, x, size.y);
}
for ( int y = 0; y < size.y; y += 15 )
{
dc.DrawLine(0, y, size.x, y);
}
}