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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user