added test for Blit()ting OnEraseBackground() results in OnPaint()
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31979 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -54,35 +54,46 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class MyFrame : public wxFrame
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
|
||||||
|
|
||||||
void OnQuit(wxCommandEvent& event);
|
|
||||||
void OnAbout(wxCommandEvent& event);
|
|
||||||
|
|
||||||
private:
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class MyCanvas : public wxScrolledWindow
|
class MyCanvas : public wxScrolledWindow
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MyCanvas( MyFrame *parent );
|
MyCanvas( wxFrame *parent );
|
||||||
|
|
||||||
|
void UseBuffer(bool useBuffer) { m_useBuffer = useBuffer; Refresh(); }
|
||||||
|
|
||||||
|
private:
|
||||||
void OnPaint( wxPaintEvent &event );
|
void OnPaint( wxPaintEvent &event );
|
||||||
void OnChar( wxKeyEvent &event );
|
void OnChar( wxKeyEvent &event );
|
||||||
void OnEraseBackground( wxEraseEvent &event );
|
void OnEraseBackground( wxEraseEvent &event );
|
||||||
|
|
||||||
|
void DoPaint(wxDC& dc);
|
||||||
|
|
||||||
|
|
||||||
wxBitmap m_bitmap;
|
wxBitmap m_bitmap;
|
||||||
wxString m_text;
|
wxString m_text;
|
||||||
|
|
||||||
private:
|
// use wxMemoryDC in OnPaint()?
|
||||||
|
bool m_useBuffer;
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MyFrame : public wxFrame
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MyFrame();
|
||||||
|
|
||||||
|
void OnUseBuffer(wxCommandEvent& event);
|
||||||
|
void OnQuit(wxCommandEvent& event);
|
||||||
|
void OnAbout(wxCommandEvent& event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
MyCanvas *m_canvas;
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// constants
|
// constants
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -90,7 +101,9 @@ private:
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
// menu items
|
// menu items
|
||||||
ID_MENU_QUIT = 1,
|
Erase_Menu_UseBuffer = 100,
|
||||||
|
Erase_Menu_Exit = wxID_EXIT,
|
||||||
|
Erase_Menu_About = wxID_ABOUT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -102,8 +115,7 @@ IMPLEMENT_APP(MyApp)
|
|||||||
|
|
||||||
bool MyApp::OnInit()
|
bool MyApp::OnInit()
|
||||||
{
|
{
|
||||||
MyFrame *frame = new MyFrame(_T("Erase sample"),
|
MyFrame *frame = new MyFrame;
|
||||||
wxPoint(50, 50), wxSize(450, 340));
|
|
||||||
|
|
||||||
frame->Show(true);
|
frame->Show(true);
|
||||||
|
|
||||||
@@ -115,22 +127,26 @@ bool MyApp::OnInit()
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||||
EVT_MENU(ID_MENU_QUIT, MyFrame::OnQuit)
|
EVT_MENU(Erase_Menu_UseBuffer, MyFrame::OnUseBuffer)
|
||||||
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
|
EVT_MENU(Erase_Menu_Exit, MyFrame::OnQuit)
|
||||||
|
EVT_MENU(Erase_Menu_About, MyFrame::OnAbout)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
// frame constructor
|
// frame constructor
|
||||||
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
MyFrame::MyFrame()
|
||||||
: wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size)
|
: wxFrame(NULL, wxID_ANY, _T("Erase sample"),
|
||||||
|
wxPoint(50, 50), wxSize(450, 340))
|
||||||
{
|
{
|
||||||
SetIcon(wxICON(mondrian));
|
SetIcon(wxICON(mondrian));
|
||||||
|
|
||||||
wxMenu *menuFile = new wxMenu(_T(""), wxMENU_TEAROFF);
|
wxMenu *menuFile = new wxMenu(_T(""), wxMENU_TEAROFF);
|
||||||
|
menuFile->AppendCheckItem(Erase_Menu_UseBuffer, _T("&Use memory DC\tCtrl-M"));
|
||||||
|
menuFile->AppendSeparator();
|
||||||
|
menuFile->Append(Erase_Menu_Exit, _T("E&xit\tAlt-X"), _T("Quit this program"));
|
||||||
|
|
||||||
|
|
||||||
wxMenu *helpMenu = new wxMenu;
|
wxMenu *helpMenu = new wxMenu;
|
||||||
helpMenu->Append(wxID_ABOUT, _T("&About...\tCtrl-A"), _T("Show about dialog"));
|
helpMenu->Append(Erase_Menu_About, _T("&About...\tCtrl-A"), _T("Show about dialog"));
|
||||||
|
|
||||||
menuFile->Append(ID_MENU_QUIT, _T("E&xit\tAlt-X"), _T("Quit this program"));
|
|
||||||
|
|
||||||
wxMenuBar *menuBar = new wxMenuBar();
|
wxMenuBar *menuBar = new wxMenuBar();
|
||||||
menuBar->Append(menuFile, _T("&File"));
|
menuBar->Append(menuFile, _T("&File"));
|
||||||
@@ -144,10 +160,15 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
|||||||
SetStatusText(_T("Welcome to wxWidgets erase sample!"));
|
SetStatusText(_T("Welcome to wxWidgets erase sample!"));
|
||||||
#endif // wxUSE_STATUSBAR
|
#endif // wxUSE_STATUSBAR
|
||||||
|
|
||||||
(void)new MyCanvas( this );
|
m_canvas = new MyCanvas( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MyFrame::OnUseBuffer(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
m_canvas->UseBuffer(event.IsChecked());
|
||||||
|
}
|
||||||
|
|
||||||
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
Close(true);
|
Close(true);
|
||||||
@@ -166,12 +187,12 @@ BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
|
|||||||
EVT_ERASE_BACKGROUND( MyCanvas::OnEraseBackground)
|
EVT_ERASE_BACKGROUND( MyCanvas::OnEraseBackground)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
MyCanvas::MyCanvas( MyFrame *parent )
|
MyCanvas::MyCanvas( wxFrame *parent )
|
||||||
: wxScrolledWindow( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
|
: wxScrolledWindow( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
|
||||||
wxScrolledWindowStyle |
|
wxScrolledWindowStyle | wxSUNKEN_BORDER )
|
||||||
wxNO_FULL_REPAINT_ON_RESIZE|
|
|
||||||
wxSUNKEN_BORDER )
|
|
||||||
{
|
{
|
||||||
|
m_useBuffer = false;
|
||||||
|
|
||||||
SetScrollbars( 10, 10, 40, 100, 0, 0 );
|
SetScrollbars( 10, 10, 40, 100, 0, 0 );
|
||||||
|
|
||||||
m_bitmap = wxBitmap( wxICON(mondrian) );
|
m_bitmap = wxBitmap( wxICON(mondrian) );
|
||||||
@@ -200,14 +221,10 @@ void MyCanvas::OnChar( wxKeyEvent &event )
|
|||||||
case WXK_RETURN: m_text += wxT( "<ENTER>" ); break;
|
case WXK_RETURN: m_text += wxT( "<ENTER>" ); break;
|
||||||
default: m_text += (wxChar)event.m_keyCode; break;
|
default: m_text += (wxChar)event.m_keyCode; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
void MyCanvas::DoPaint(wxDC& dc)
|
||||||
{
|
{
|
||||||
wxPaintDC dc(this);
|
|
||||||
PrepareDC( dc );
|
|
||||||
|
|
||||||
dc.SetBrush( *wxBLACK_BRUSH );
|
dc.SetBrush( *wxBLACK_BRUSH );
|
||||||
dc.DrawRectangle( 0,0,200,50 );
|
dc.DrawRectangle( 0,0,200,50 );
|
||||||
|
|
||||||
@@ -271,21 +288,45 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
|||||||
#endif // 0
|
#endif // 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
||||||
|
{
|
||||||
|
wxPaintDC dcWin(this);
|
||||||
|
PrepareDC( dcWin );
|
||||||
|
|
||||||
|
if ( m_useBuffer )
|
||||||
|
{
|
||||||
|
const wxSize size = GetClientSize();
|
||||||
|
wxMemoryDC dc;
|
||||||
|
wxBitmap bmp(size.x, size.y);
|
||||||
|
dc.SelectObject(bmp);
|
||||||
|
dc.Blit(0, 0, size.x, size.y, &dcWin, 0, 0);
|
||||||
|
dc.DrawText(_T("(copy of background)"), 5, 120 );
|
||||||
|
|
||||||
|
DoPaint(dc);
|
||||||
|
|
||||||
|
dcWin.Blit(0, 0, size.x, size.y, &dc, 0, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DoPaint(dcWin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MyCanvas::OnEraseBackground( wxEraseEvent& event )
|
void MyCanvas::OnEraseBackground( wxEraseEvent& event )
|
||||||
{
|
{
|
||||||
wxDC& dc = *event.GetDC();
|
wxDC& dc = *event.GetDC();
|
||||||
dc.SetPen(*wxGREEN_PEN);
|
dc.SetPen(*wxGREEN_PEN);
|
||||||
|
|
||||||
// this line is needed, otherwise the junk is left on win the background
|
// clear any junk currently displayed
|
||||||
dc.Clear();
|
dc.Clear();
|
||||||
|
|
||||||
wxSize size = GetClientSize();
|
const wxSize size = GetClientSize();
|
||||||
for ( int x = 0; x < size.x; x+= 10 )
|
for ( int x = 0; x < size.x; x += 10 )
|
||||||
{
|
{
|
||||||
dc.DrawLine(x, 0, x, size.y);
|
dc.DrawLine(x, 0, x, size.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( int y = 0; y < size.y; y+= 10 )
|
for ( int y = 0; y < size.y; y += 10 )
|
||||||
{
|
{
|
||||||
dc.DrawLine(0, y, size.x, y);
|
dc.DrawLine(0, y, size.x, y);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user