From 79c5fe4be8006c36f0aa8278752494122d82e6ec Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 13 Feb 2005 01:14:36 +0000 Subject: [PATCH] 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 --- samples/erase/erase.cpp | 115 +++++++++++++++++++++++++++------------- 1 file changed, 78 insertions(+), 37 deletions(-) diff --git a/samples/erase/erase.cpp b/samples/erase/erase.cpp index cd9c9f8ac2..db1a3632cc 100644 --- a/samples/erase/erase.cpp +++ b/samples/erase/erase.cpp @@ -54,35 +54,46 @@ public: }; -class MyFrame : public wxFrame +class MyCanvas : public wxScrolledWindow { public: - MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); + MyCanvas( wxFrame *parent ); - void OnQuit(wxCommandEvent& event); - void OnAbout(wxCommandEvent& event); + void UseBuffer(bool useBuffer) { m_useBuffer = useBuffer; Refresh(); } private: - DECLARE_EVENT_TABLE() -}; - - -class MyCanvas : public wxScrolledWindow -{ -public: - MyCanvas( MyFrame *parent ); - void OnPaint( wxPaintEvent &event ); void OnChar( wxKeyEvent &event ); void OnEraseBackground( wxEraseEvent &event ); + void DoPaint(wxDC& dc); + + wxBitmap m_bitmap; wxString m_text; + // use wxMemoryDC in OnPaint()? + bool m_useBuffer; + + 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 // ---------------------------------------------------------------------------- @@ -90,7 +101,9 @@ private: enum { // 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() { - MyFrame *frame = new MyFrame(_T("Erase sample"), - wxPoint(50, 50), wxSize(450, 340)); + MyFrame *frame = new MyFrame; frame->Show(true); @@ -115,22 +127,26 @@ bool MyApp::OnInit() // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU(ID_MENU_QUIT, MyFrame::OnQuit) - EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) + EVT_MENU(Erase_Menu_UseBuffer, MyFrame::OnUseBuffer) + EVT_MENU(Erase_Menu_Exit, MyFrame::OnQuit) + EVT_MENU(Erase_Menu_About, MyFrame::OnAbout) END_EVENT_TABLE() // frame constructor -MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) - : wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size) +MyFrame::MyFrame() + : wxFrame(NULL, wxID_ANY, _T("Erase sample"), + wxPoint(50, 50), wxSize(450, 340)) { SetIcon(wxICON(mondrian)); 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; - helpMenu->Append(wxID_ABOUT, _T("&About...\tCtrl-A"), _T("Show about dialog")); - menuFile->Append(ID_MENU_QUIT, _T("E&xit\tAlt-X"), _T("Quit this program")); + wxMenu *helpMenu = new wxMenu; + helpMenu->Append(Erase_Menu_About, _T("&About...\tCtrl-A"), _T("Show about dialog")); wxMenuBar *menuBar = new wxMenuBar(); 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!")); #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)) { Close(true); @@ -166,12 +187,12 @@ BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) EVT_ERASE_BACKGROUND( MyCanvas::OnEraseBackground) END_EVENT_TABLE() -MyCanvas::MyCanvas( MyFrame *parent ) +MyCanvas::MyCanvas( wxFrame *parent ) : wxScrolledWindow( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, - wxScrolledWindowStyle | - wxNO_FULL_REPAINT_ON_RESIZE| - wxSUNKEN_BORDER ) + wxScrolledWindowStyle | wxSUNKEN_BORDER ) { + m_useBuffer = false; + SetScrollbars( 10, 10, 40, 100, 0, 0 ); m_bitmap = wxBitmap( wxICON(mondrian) ); @@ -200,14 +221,10 @@ void MyCanvas::OnChar( wxKeyEvent &event ) case WXK_RETURN: m_text += wxT( "" ); 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.DrawRectangle( 0,0,200,50 ); @@ -271,21 +288,45 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) #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 ) { wxDC& dc = *event.GetDC(); dc.SetPen(*wxGREEN_PEN); - // this line is needed, otherwise the junk is left on win the background + // clear any junk currently displayed dc.Clear(); - wxSize size = GetClientSize(); - for ( int x = 0; x < size.x; x+= 10 ) + const wxSize size = GetClientSize(); + for ( int x = 0; x < size.x; x += 10 ) { 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); } -- 2.45.2