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:
@@ -400,7 +400,6 @@ protected:
|
|||||||
// actual size of window. This method also setup scrollbars
|
// actual size of window. This method also setup scrollbars
|
||||||
void CreateLayout();
|
void CreateLayout();
|
||||||
|
|
||||||
void OnEraseBackground(wxEraseEvent& event);
|
|
||||||
void OnPaint(wxPaintEvent& event);
|
void OnPaint(wxPaintEvent& event);
|
||||||
void OnSize(wxSizeEvent& event);
|
void OnSize(wxSizeEvent& event);
|
||||||
void OnMouseMove(wxMouseEvent& event);
|
void OnMouseMove(wxMouseEvent& event);
|
||||||
@@ -510,8 +509,13 @@ protected:
|
|||||||
#endif // wxUSE_CLIPBOARD
|
#endif // wxUSE_CLIPBOARD
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// window content for double buffered rendering:
|
// erase the window background using m_bmpBg or just solid colour if we
|
||||||
wxBitmap *m_backBuffer;
|
// don't have any background image
|
||||||
|
void DoEraseBackground(wxDC& dc);
|
||||||
|
|
||||||
|
// window content for double buffered rendering, may be invalid until it is
|
||||||
|
// really initialized in OnPaint()
|
||||||
|
wxBitmap m_backBuffer;
|
||||||
|
|
||||||
// background image, may be invalid
|
// background image, may be invalid
|
||||||
wxBitmap m_bmpBg;
|
wxBitmap m_bmpBg;
|
||||||
@@ -539,10 +543,6 @@ private:
|
|||||||
// if this FLAG is false, items are not added to history
|
// if this FLAG is false, items are not added to history
|
||||||
bool m_HistoryOn;
|
bool m_HistoryOn;
|
||||||
|
|
||||||
// a flag set if we need to erase background in OnPaint() (otherwise this
|
|
||||||
// is supposed to have been done in OnEraseBackground())
|
|
||||||
bool m_eraseBgInOnPaint;
|
|
||||||
|
|
||||||
// standard mouse cursors
|
// standard mouse cursors
|
||||||
static wxCursor *ms_cursorLink;
|
static wxCursor *ms_cursorLink;
|
||||||
static wxCursor *ms_cursorText;
|
static wxCursor *ms_cursorText;
|
||||||
|
@@ -49,18 +49,32 @@ public:
|
|||||||
class MyHtmlWindow : public wxHtmlWindow
|
class MyHtmlWindow : public wxHtmlWindow
|
||||||
{
|
{
|
||||||
public:
|
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),
|
virtual wxHtmlOpeningStatus OnOpeningURL(wxHtmlURLType WXUNUSED(type),
|
||||||
const wxString& WXUNUSED(url),
|
const wxString& WXUNUSED(url),
|
||||||
wxString *WXUNUSED(redirect)) const;
|
wxString *WXUNUSED(redirect)) const;
|
||||||
|
|
||||||
private:
|
// toggle drawing of custom background
|
||||||
void OnClipboardEvent(wxClipboardTextEvent& event);
|
void DrawCustomBg(bool draw)
|
||||||
|
{
|
||||||
|
m_drawCustomBg = draw;
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
#if wxUSE_CLIPBOARD
|
#if wxUSE_CLIPBOARD
|
||||||
DECLARE_EVENT_TABLE()
|
void OnClipboardEvent(wxClipboardTextEvent& event);
|
||||||
#endif // wxUSE_CLIPBOARD
|
#endif // wxUSE_CLIPBOARD
|
||||||
|
void OnEraseBgEvent(wxEraseEvent& event);
|
||||||
|
|
||||||
|
bool m_drawCustomBg;
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
wxDECLARE_NO_COPY_CLASS(MyHtmlWindow);
|
wxDECLARE_NO_COPY_CLASS(MyHtmlWindow);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -79,6 +93,7 @@ public:
|
|||||||
void OnBack(wxCommandEvent& event);
|
void OnBack(wxCommandEvent& event);
|
||||||
void OnForward(wxCommandEvent& event);
|
void OnForward(wxCommandEvent& event);
|
||||||
void OnProcessor(wxCommandEvent& event);
|
void OnProcessor(wxCommandEvent& event);
|
||||||
|
void OnDrawCustomBg(wxCommandEvent& event);
|
||||||
|
|
||||||
void OnHtmlLinkClicked(wxHtmlLinkEvent& event);
|
void OnHtmlLinkClicked(wxHtmlLinkEvent& event);
|
||||||
void OnHtmlCellHover(wxHtmlCellEvent &event);
|
void OnHtmlCellHover(wxHtmlCellEvent &event);
|
||||||
@@ -121,7 +136,8 @@ enum
|
|||||||
ID_DefaultWebBrowser,
|
ID_DefaultWebBrowser,
|
||||||
ID_Back,
|
ID_Back,
|
||||||
ID_Forward,
|
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_Back, MyFrame::OnBack)
|
||||||
EVT_MENU(ID_Forward, MyFrame::OnForward)
|
EVT_MENU(ID_Forward, MyFrame::OnForward)
|
||||||
EVT_MENU(ID_Processor, MyFrame::OnProcessor)
|
EVT_MENU(ID_Processor, MyFrame::OnProcessor)
|
||||||
|
EVT_MENU(ID_DrawCustomBg, MyFrame::OnDrawCustomBg)
|
||||||
|
|
||||||
EVT_HTML_LINK_CLICKED(wxID_ANY, MyFrame::OnHtmlLinkClicked)
|
EVT_HTML_LINK_CLICKED(wxID_ANY, MyFrame::OnHtmlLinkClicked)
|
||||||
EVT_HTML_CELL_HOVER(wxID_ANY, MyFrame::OnHtmlCellHover)
|
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->AppendSeparator();
|
||||||
menuFile->Append(ID_Processor, _("&Remove bold attribute"),
|
menuFile->Append(ID_Processor, _("&Remove bold attribute"),
|
||||||
wxEmptyString, wxITEM_CHECK);
|
wxEmptyString, wxITEM_CHECK);
|
||||||
|
menuFile->AppendSeparator();
|
||||||
|
menuFile->AppendCheckItem(ID_DrawCustomBg, "&Draw custom background");
|
||||||
menuFile->AppendSeparator();
|
menuFile->AppendSeparator();
|
||||||
menuFile->Append(wxID_EXIT, _("&Close frame"));
|
menuFile->Append(wxID_EXIT, _("&Close frame"));
|
||||||
menuNav->Append(ID_Back, _("Go &BACK"));
|
menuNav->Append(ID_Back, _("Go &BACK"));
|
||||||
@@ -323,6 +341,11 @@ void MyFrame::OnProcessor(wxCommandEvent& WXUNUSED(event))
|
|||||||
m_Html->LoadPage(m_Html->GetOpenedPage());
|
m_Html->LoadPage(m_Html->GetOpenedPage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyFrame::OnDrawCustomBg(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
m_Html->DrawCustomBg(event.IsChecked());
|
||||||
|
}
|
||||||
|
|
||||||
void MyFrame::OnHtmlLinkClicked(wxHtmlLinkEvent &event)
|
void MyFrame::OnHtmlLinkClicked(wxHtmlLinkEvent &event)
|
||||||
{
|
{
|
||||||
wxLogMessage(wxT("The url '%s' has been clicked!"), event.GetLinkInfo().GetHref().c_str());
|
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;
|
return wxHTML_OPEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if wxUSE_CLIPBOARD
|
|
||||||
BEGIN_EVENT_TABLE(MyHtmlWindow, wxHtmlWindow)
|
BEGIN_EVENT_TABLE(MyHtmlWindow, wxHtmlWindow)
|
||||||
|
#if wxUSE_CLIPBOARD
|
||||||
EVT_TEXT_COPY(wxID_ANY, MyHtmlWindow::OnClipboardEvent)
|
EVT_TEXT_COPY(wxID_ANY, MyHtmlWindow::OnClipboardEvent)
|
||||||
|
#endif // wxUSE_CLIPBOARD
|
||||||
|
EVT_ERASE_BACKGROUND(MyHtmlWindow::OnEraseBgEvent)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
#if wxUSE_CLIPBOARD
|
||||||
void MyHtmlWindow::OnClipboardEvent(wxClipboardTextEvent& WXUNUSED(event))
|
void MyHtmlWindow::OnClipboardEvent(wxClipboardTextEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
// explicitly call wxHtmlWindow::CopySelection() method
|
// explicitly call wxHtmlWindow::CopySelection() method
|
||||||
@@ -385,3 +411,30 @@ void MyHtmlWindow::OnClipboardEvent(wxClipboardTextEvent& WXUNUSED(event))
|
|||||||
wxLogStatus(_T("Clipboard: nothing"));
|
wxLogStatus(_T("Clipboard: nothing"));
|
||||||
}
|
}
|
||||||
#endif // wxUSE_CLIPBOARD
|
#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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -35,6 +35,9 @@
|
|||||||
#include "wx/arrimpl.cpp"
|
#include "wx/arrimpl.cpp"
|
||||||
#include "wx/listimpl.cpp"
|
#include "wx/listimpl.cpp"
|
||||||
|
|
||||||
|
// uncomment this line to visually show the extent of the selection
|
||||||
|
//#define DEBUG_HTML_SELECTION
|
||||||
|
|
||||||
// HTML events:
|
// HTML events:
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlLinkEvent, wxCommandEvent)
|
IMPLEMENT_DYNAMIC_CLASS(wxHtmlLinkEvent, wxCommandEvent)
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlCellEvent, wxCommandEvent)
|
IMPLEMENT_DYNAMIC_CLASS(wxHtmlCellEvent, wxCommandEvent)
|
||||||
@@ -312,8 +315,6 @@ void wxHtmlWindow::Init()
|
|||||||
m_timerAutoScroll = NULL;
|
m_timerAutoScroll = NULL;
|
||||||
m_lastDoubleClick = 0;
|
m_lastDoubleClick = 0;
|
||||||
#endif // wxUSE_CLIPBOARD
|
#endif // wxUSE_CLIPBOARD
|
||||||
m_backBuffer = NULL;
|
|
||||||
m_eraseBgInOnPaint = false;
|
|
||||||
m_tmpSelFromCell = NULL;
|
m_tmpSelFromCell = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,6 +327,18 @@ bool wxHtmlWindow::Create(wxWindow *parent, wxWindowID id,
|
|||||||
name))
|
name))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// We can't erase our background in EVT_ERASE_BACKGROUND handler and use
|
||||||
|
// double buffering in EVT_PAINT handler as this requires blitting back
|
||||||
|
// something already drawn on the window to the backing store bitmap when
|
||||||
|
// handling EVT_PAINT but blitting in this direction is simply not
|
||||||
|
// supported by OS X.
|
||||||
|
//
|
||||||
|
// So instead we use a hack with artificial EVT_ERASE_BACKGROUND generation
|
||||||
|
// from OnPaint() and this means that we never need the "real" erase event
|
||||||
|
// at all so disable it to avoid executing any user-defined handlers twice
|
||||||
|
// (and to avoid processing unnecessary event if no handlers are defined).
|
||||||
|
SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||||
|
|
||||||
SetPage(wxT("<html><body></body></html>"));
|
SetPage(wxT("<html><body></body></html>"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -351,7 +364,6 @@ wxHtmlWindow::~wxHtmlWindow()
|
|||||||
delete m_FS;
|
delete m_FS;
|
||||||
delete m_History;
|
delete m_History;
|
||||||
delete m_Processors;
|
delete m_Processors;
|
||||||
delete m_backBuffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -979,90 +991,89 @@ void wxHtmlWindow::OnLinkClicked(const wxHtmlLinkInfo& link)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxHtmlWindow::OnEraseBackground(wxEraseEvent& event)
|
void wxHtmlWindow::DoEraseBackground(wxDC& dc)
|
||||||
{
|
{
|
||||||
if ( !m_bmpBg.Ok() )
|
// if we don't have any background bitmap we just fill it with background
|
||||||
|
// colour and we also must do it if the background bitmap is not fully
|
||||||
|
// opaque as otherwise junk could be left there
|
||||||
|
if ( !m_bmpBg.IsOk() || m_bmpBg.GetMask() )
|
||||||
{
|
{
|
||||||
// don't even skip the event, if we don't have a bg bitmap we're going
|
dc.SetBackground(GetBackgroundColour());
|
||||||
// to overwrite background in OnPaint() below anyhow, so letting the
|
|
||||||
// default handling take place would only result in flicker, just set a
|
|
||||||
// flag to erase the background below
|
|
||||||
m_eraseBgInOnPaint = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxDC& dc = *event.GetDC();
|
|
||||||
|
|
||||||
// if the image is not fully opaque, we have to erase the background before
|
|
||||||
// drawing it, however avoid doing it for opaque images as this would just
|
|
||||||
// result in extra flicker without any other effect as background is
|
|
||||||
// completely covered anyhow
|
|
||||||
if ( m_bmpBg.GetMask() )
|
|
||||||
{
|
|
||||||
dc.SetBackground(wxBrush(GetBackgroundColour(), wxBRUSHSTYLE_SOLID));
|
|
||||||
dc.Clear();
|
dc.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
const wxSize sizeWin(GetClientSize());
|
if ( m_bmpBg.IsOk() )
|
||||||
const wxSize sizeBmp(m_bmpBg.GetWidth(), m_bmpBg.GetHeight());
|
|
||||||
for ( wxCoord x = 0; x < sizeWin.x; x += sizeBmp.x )
|
|
||||||
{
|
{
|
||||||
for ( wxCoord y = 0; y < sizeWin.y; y += sizeBmp.y )
|
// draw the background bitmap tiling it over the entire window area
|
||||||
|
const wxSize sz = GetClientSize();
|
||||||
|
const wxSize sizeBmp(m_bmpBg.GetWidth(), m_bmpBg.GetHeight());
|
||||||
|
for ( wxCoord x = 0; x < sz.x; x += sizeBmp.x )
|
||||||
|
{
|
||||||
|
for ( wxCoord y = 0; y < sz.y; y += sizeBmp.y )
|
||||||
{
|
{
|
||||||
dc.DrawBitmap(m_bmpBg, x, y, true /* use mask */);
|
dc.DrawBitmap(m_bmpBg, x, y, true /* use mask */);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
|
void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
wxPaintDC dc(this);
|
wxPaintDC dcPaint(this);
|
||||||
|
|
||||||
if (m_tmpCanDrawLocks > 0 || m_Cell == NULL)
|
if (m_tmpCanDrawLocks > 0 || m_Cell == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
GetViewStart(&x, &y);
|
GetViewStart(&x, &y);
|
||||||
wxRect rect = GetUpdateRegion().GetBox();
|
const wxRect rect = GetUpdateRegion().GetBox();
|
||||||
wxSize sz = GetSize();
|
const wxSize sz = GetClientSize();
|
||||||
|
|
||||||
|
// set up the DC we're drawing on: if the window is already double buffered
|
||||||
|
// we do it directly on wxPaintDC, otherwise we allocate a backing store
|
||||||
|
// buffer and compose the drawing there and then blit it to screen all at
|
||||||
|
// once
|
||||||
|
wxDC *dc;
|
||||||
wxMemoryDC dcm;
|
wxMemoryDC dcm;
|
||||||
if ( !m_backBuffer )
|
if ( IsDoubleBuffered() )
|
||||||
m_backBuffer = new wxBitmap(sz.x, sz.y);
|
|
||||||
dcm.SelectObject(*m_backBuffer);
|
|
||||||
|
|
||||||
if ( m_eraseBgInOnPaint )
|
|
||||||
{
|
{
|
||||||
dcm.SetBackground(wxBrush(GetBackgroundColour(), wxBRUSHSTYLE_SOLID));
|
dc = &dcPaint;
|
||||||
dcm.Clear();
|
|
||||||
|
|
||||||
m_eraseBgInOnPaint = false;
|
|
||||||
}
|
}
|
||||||
else // someone has already erased the background, keep it
|
else // window is not double buffered by the system, do it ourselves
|
||||||
{
|
{
|
||||||
// preserve the existing background, otherwise we'd erase anything the
|
if ( !m_backBuffer.IsOk() )
|
||||||
// user code had drawn in its EVT_ERASE_BACKGROUND handler when we do
|
m_backBuffer.Create(sz.x, sz.y);
|
||||||
// the Blit back below
|
dcm.SelectObject(m_backBuffer);
|
||||||
dcm.Blit(0, rect.GetTop(),
|
dc = &dcm;
|
||||||
sz.x, rect.GetBottom() - rect.GetTop() + 1,
|
|
||||||
&dc,
|
|
||||||
0, rect.GetTop());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PrepareDC(dcm);
|
PrepareDC(*dc);
|
||||||
dcm.SetMapMode(wxMM_TEXT);
|
|
||||||
dcm.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT);
|
// erase the background: for compatibility, we must generate the event to
|
||||||
|
// allow the user-defined handlers to do it
|
||||||
|
wxEraseEvent eraseEvent(GetId(), dc);
|
||||||
|
eraseEvent.SetEventObject(this);
|
||||||
|
if ( !ProcessWindowEvent(eraseEvent) )
|
||||||
|
{
|
||||||
|
// erase background ourselves
|
||||||
|
DoEraseBackground(*dc);
|
||||||
|
}
|
||||||
|
//else: background erased by the user-defined handler
|
||||||
|
|
||||||
|
|
||||||
|
// draw the HTML window contents
|
||||||
|
dc->SetMapMode(wxMM_TEXT);
|
||||||
|
dc->SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT);
|
||||||
|
|
||||||
wxHtmlRenderingInfo rinfo;
|
wxHtmlRenderingInfo rinfo;
|
||||||
wxDefaultHtmlRenderingStyle rstyle;
|
wxDefaultHtmlRenderingStyle rstyle;
|
||||||
rinfo.SetSelection(m_selection);
|
rinfo.SetSelection(m_selection);
|
||||||
rinfo.SetStyle(&rstyle);
|
rinfo.SetStyle(&rstyle);
|
||||||
m_Cell->Draw(dcm, 0, 0,
|
m_Cell->Draw(*dc, 0, 0,
|
||||||
y * wxHTML_SCROLL_STEP + rect.GetTop(),
|
y * wxHTML_SCROLL_STEP + rect.GetTop(),
|
||||||
y * wxHTML_SCROLL_STEP + rect.GetBottom(),
|
y * wxHTML_SCROLL_STEP + rect.GetBottom(),
|
||||||
rinfo);
|
rinfo);
|
||||||
|
|
||||||
//#define DEBUG_HTML_SELECTION
|
|
||||||
#ifdef DEBUG_HTML_SELECTION
|
#ifdef DEBUG_HTML_SELECTION
|
||||||
{
|
{
|
||||||
int xc, yc, x, y;
|
int xc, yc, x, y;
|
||||||
@@ -1075,27 +1086,30 @@ void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
|
|||||||
wxHtmlCell *after =
|
wxHtmlCell *after =
|
||||||
m_Cell->FindCellByPos(x, y, wxHTML_FIND_NEAREST_AFTER);
|
m_Cell->FindCellByPos(x, y, wxHTML_FIND_NEAREST_AFTER);
|
||||||
|
|
||||||
dcm.SetBrush(*wxTRANSPARENT_BRUSH);
|
dc->SetBrush(*wxTRANSPARENT_BRUSH);
|
||||||
dcm.SetPen(*wxBLACK_PEN);
|
dc->SetPen(*wxBLACK_PEN);
|
||||||
if (at)
|
if (at)
|
||||||
dcm.DrawRectangle(at->GetAbsPos(),
|
dc->DrawRectangle(at->GetAbsPos(),
|
||||||
wxSize(at->GetWidth(),at->GetHeight()));
|
wxSize(at->GetWidth(),at->GetHeight()));
|
||||||
dcm.SetPen(*wxGREEN_PEN);
|
dc->SetPen(*wxGREEN_PEN);
|
||||||
if (before)
|
if (before)
|
||||||
dcm.DrawRectangle(before->GetAbsPos().x+1, before->GetAbsPos().y+1,
|
dc->DrawRectangle(before->GetAbsPos().x+1, before->GetAbsPos().y+1,
|
||||||
before->GetWidth()-2,before->GetHeight()-2);
|
before->GetWidth()-2,before->GetHeight()-2);
|
||||||
dcm.SetPen(*wxRED_PEN);
|
dc->SetPen(*wxRED_PEN);
|
||||||
if (after)
|
if (after)
|
||||||
dcm.DrawRectangle(after->GetAbsPos().x+2, after->GetAbsPos().y+2,
|
dc->DrawRectangle(after->GetAbsPos().x+2, after->GetAbsPos().y+2,
|
||||||
after->GetWidth()-4,after->GetHeight()-4);
|
after->GetWidth()-4,after->GetHeight()-4);
|
||||||
}
|
}
|
||||||
#endif
|
#endif // DEBUG_HTML_SELECTION
|
||||||
|
|
||||||
dcm.SetDeviceOrigin(0,0);
|
if ( dc != &dcPaint )
|
||||||
dc.Blit(0, rect.GetTop(),
|
{
|
||||||
|
dc->SetDeviceOrigin(0,0);
|
||||||
|
dcPaint.Blit(0, rect.GetTop(),
|
||||||
sz.x, rect.GetBottom() - rect.GetTop() + 1,
|
sz.x, rect.GetBottom() - rect.GetTop() + 1,
|
||||||
&dcm,
|
dc,
|
||||||
0, rect.GetTop());
|
0, rect.GetTop());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1105,7 +1119,7 @@ void wxHtmlWindow::OnSize(wxSizeEvent& event)
|
|||||||
{
|
{
|
||||||
event.Skip();
|
event.Skip();
|
||||||
|
|
||||||
wxDELETE(m_backBuffer);
|
m_backBuffer = wxNullBitmap;
|
||||||
|
|
||||||
CreateLayout();
|
CreateLayout();
|
||||||
|
|
||||||
@@ -1567,7 +1581,6 @@ BEGIN_EVENT_TABLE(wxHtmlWindow, wxScrolledWindow)
|
|||||||
EVT_LEFT_UP(wxHtmlWindow::OnMouseUp)
|
EVT_LEFT_UP(wxHtmlWindow::OnMouseUp)
|
||||||
EVT_RIGHT_UP(wxHtmlWindow::OnMouseUp)
|
EVT_RIGHT_UP(wxHtmlWindow::OnMouseUp)
|
||||||
EVT_MOTION(wxHtmlWindow::OnMouseMove)
|
EVT_MOTION(wxHtmlWindow::OnMouseMove)
|
||||||
EVT_ERASE_BACKGROUND(wxHtmlWindow::OnEraseBackground)
|
|
||||||
EVT_PAINT(wxHtmlWindow::OnPaint)
|
EVT_PAINT(wxHtmlWindow::OnPaint)
|
||||||
#if wxUSE_CLIPBOARD
|
#if wxUSE_CLIPBOARD
|
||||||
EVT_LEFT_DCLICK(wxHtmlWindow::OnDoubleClick)
|
EVT_LEFT_DCLICK(wxHtmlWindow::OnDoubleClick)
|
||||||
|
Reference in New Issue
Block a user