X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4d2c67a9dad9b04a5346c3a5131890da7f0aa853..40711af81b4a412892045837997211d597d98ff2:/samples/erase/erase.cpp?ds=sidebyside diff --git a/samples/erase/erase.cpp b/samples/erase/erase.cpp index dde8738687..f3b752b666 100644 --- a/samples/erase/erase.cpp +++ b/samples/erase/erase.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: erase.cpp -// Purpose: Erase wxWindows sample +// Purpose: Erase wxWidgets sample // Author: Robert Roebling // Modified by: // Created: 04/01/98 @@ -17,9 +17,9 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "erase.cpp" - #pragma interface "erase.cpp" +#if defined(__GNUG__) && !defined(__APPLE__) + #pragma implementation + #pragma interface #endif // For compilers that support precompilation, includes "wx/wx.h". @@ -30,7 +30,7 @@ #endif // for all others, include the necessary headers (this file is usually all you -// need because it includes almost all "standard" wxWindows headers) +// need because it includes almost all "standard" wxWidgets headers) #ifndef WX_PRECOMP #include "wx/wx.h" #endif @@ -39,7 +39,7 @@ // resources // ---------------------------------------------------------------------------- // the application icon -#if defined(__WXGTK__) || defined(__WXMOTIF__) +#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__) #include "mondrian.xpm" #endif @@ -54,31 +54,52 @@ 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(); } + void EraseBg(bool eraseBg) { m_eraseBg = eraseBg; Refresh(); } private: + 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; + + // paint custom background in OnEraseBackground()? + bool m_eraseBg; + + DECLARE_EVENT_TABLE() }; - -class MyCanvas : public wxScrolledWindow +class MyFrame : public wxFrame { public: - MyCanvas( MyFrame *parent ); - - void OnPaint( wxPaintEvent &event ); - void OnEraseBackground( wxEraseEvent &event ); + MyFrame(); + + void OnUseBuffer(wxCommandEvent& event); + void OnEraseBg(wxCommandEvent& event); + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); private: + MyCanvas *m_canvas; + DECLARE_EVENT_TABLE() }; + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -86,8 +107,10 @@ private: enum { // menu items - Minimal_Quit = 1, - Minimal_About + Erase_Menu_UseBuffer = 100, + Erase_Menu_EraseBg, + Erase_Menu_Exit = wxID_EXIT, + Erase_Menu_About = wxID_ABOUT }; @@ -99,12 +122,11 @@ IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { - MyFrame *frame = new MyFrame("Minimal wxWindows App", - wxPoint(50, 50), wxSize(450, 340)); + MyFrame *frame = new MyFrame; - frame->Show(TRUE); - - return TRUE; + frame->Show(true); + + return true; } // ---------------------------------------------------------------------------- @@ -112,81 +134,229 @@ bool MyApp::OnInit() // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU(Minimal_Quit, MyFrame::OnQuit) - EVT_MENU(Minimal_About, MyFrame::OnAbout) + EVT_MENU(Erase_Menu_UseBuffer, MyFrame::OnUseBuffer) + EVT_MENU(Erase_Menu_EraseBg, MyFrame::OnEraseBg) + 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, -1, title, pos, size) +MyFrame::MyFrame() + : wxFrame(NULL, wxID_ANY, _T("Erase sample"), + wxPoint(50, 50), wxSize(450, 340)) { -#ifdef __WXMAC__ - wxApp::s_macAboutMenuItemId = Minimal_About; -#endif - SetIcon(wxICON(mondrian)); - wxMenu *menuFile = new wxMenu("", wxMENU_TEAROFF); + wxMenu *menuFile = new wxMenu(_T(""), wxMENU_TEAROFF); + menuFile->AppendCheckItem(Erase_Menu_UseBuffer, _T("&Use memory DC\tCtrl-M")); + menuFile->AppendCheckItem(Erase_Menu_EraseBg, _T("Custom &background\tCtrl-B")); + menuFile->AppendSeparator(); + menuFile->Append(Erase_Menu_Exit, _T("E&xit\tAlt-X"), _T("Quit this program")); - wxMenu *helpMenu = new wxMenu; - helpMenu->Append(Minimal_About, "&About...\tCtrl-A", "Show about dialog"); - menuFile->Append(Minimal_Quit, "E&xit\tAlt-X", "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, "&File"); - menuBar->Append(helpMenu, "&Help"); + menuBar->Append(menuFile, _T("&File")); + menuBar->Append(helpMenu, _T("&Help")); SetMenuBar(menuBar); #if wxUSE_STATUSBAR // create a status bar just for fun (by default with 1 pane only) CreateStatusBar(2); - SetStatusText("Welcome to wxWindows!"); + 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::OnEraseBg(wxCommandEvent& event) +{ + m_canvas->EraseBg(event.IsChecked()); +} + void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { - Close(TRUE); + Close(true); } void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { - wxString msg; - msg.Printf( _T("This is the about dialog of tghe Erase sample.\n") - _T("Welcome to %s"), wxVERSION_STRING); - - wxMessageBox(msg, "About Erase", wxOK | wxICON_INFORMATION, this); + wxMessageBox(_T("This sample shows how you can draw custom background."), + _T("About Erase Sample"), wxOK | wxICON_INFORMATION, this); } BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) EVT_PAINT( MyCanvas::OnPaint) + EVT_CHAR( MyCanvas::OnChar) EVT_ERASE_BACKGROUND( MyCanvas::OnEraseBackground) END_EVENT_TABLE() -MyCanvas::MyCanvas( MyFrame *parent ) - : wxScrolledWindow( parent, -1, wxDefaultPosition, wxDefaultSize, - wxScrolledWindowStyle|wxNO_FULL_REPAINT_ON_RESIZE ) +MyCanvas::MyCanvas( wxFrame *parent ) + : wxScrolledWindow( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, + wxScrolledWindowStyle | wxSUNKEN_BORDER ) { + m_eraseBg = + m_useBuffer = false; + SetScrollbars( 10, 10, 40, 100, 0, 0 ); + + m_bitmap = wxBitmap( wxICON(mondrian) ); + + new wxStaticBitmap( this, wxID_ANY, m_bitmap, wxPoint(80,20) ); + + SetFocusIgnoringChildren(); } -void MyCanvas::OnPaint( wxPaintEvent &event ) +void MyCanvas::OnChar( wxKeyEvent &event ) { - wxPaintDC dc(this); - PrepareDC( dc ); - +#if wxUSE_UNICODE + if (event.m_uniChar) + { + m_text += event.m_uniChar; + Refresh(); + return; + } +#endif + + // some test cases + switch (event.m_keyCode) + { + case WXK_UP: m_text += wxT( "" ); break; + case WXK_LEFT: m_text += wxT( "" ); break; + case WXK_RIGHT: m_text += wxT( "" ); break; + case WXK_DOWN: m_text += wxT( "" ); break; + case WXK_RETURN: m_text += wxT( "" ); break; + default: m_text += (wxChar)event.m_keyCode; break; + } +} + +void MyCanvas::DoPaint(wxDC& dc) +{ + dc.SetBrush( *wxBLACK_BRUSH ); + dc.DrawRectangle( 10,10,200,50 ); + + dc.DrawBitmap( m_bitmap, 10, 20, true ); + + dc.SetTextForeground(*wxBLUE); + dc.DrawText(_T("This text is drawn from OnPaint"), 65, 65); + + wxString tmp; + tmp.Printf( _T("Hit any key to display more text: %s"), m_text.c_str() ); + int w,h; + dc.GetTextExtent( tmp, &w, &h ); + dc.SetBrush( *wxWHITE_BRUSH ); + dc.DrawRectangle( 65, 85, w, h ); + dc.DrawText( tmp, 65, 85 ); + +#if 0 + wxRegionIterator upd( GetUpdateRegion() ); + while (upd) + { + wxLogDebug( _T("Paint: %d %d %d %d"), upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() ); + upd ++; + } +#endif + +#if 0 + wxSize size = GetSize(); + wxSize client_size = GetClientSize(); + wxLogDebug( _T("size %d %d client_size %d %d"), size.x, size.y, client_size.x, client_size.y ); +#endif + +#if 0 + int i; + dc.SetPen( *wxWHITE_PEN ); + for (i = 0; i < 20; i += 2) + dc.DrawLine( i,i, i+100,i ); + + dc.SetPen( *wxWHITE_PEN ); + for (i = 200; i < 220; i += 2) + dc.DrawLine( i-200,i, i-100,i ); + + wxRegion region( 110, 110, 80, 80 ); + wxRegion hole( 130, 130, 40, 1 ); + region.Intersect( hole ); + dc.SetClippingRegion( region ); + dc.SetBrush( *wxRED_BRUSH ); - dc.DrawRectangle( 100, 100, 300, 500 ); + dc.DrawRectangle( 100, 100, 200, 200 ); + + dc.DestroyClippingRegion(); + + dc.SetPen( *wxTRANSPARENT_PEN ); + + wxRegion strip( 110, 200, 30, 1 ); + wxRegionIterator it( strip ); + while (it) + { + dc.DrawRectangle( it.GetX(), it.GetY(), it.GetWidth(), it.GetHeight() ); + it ++; + } +#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 ) { - event.Skip( TRUE ); + if ( !m_eraseBg ) + { + event.Skip(); + return; + } + + wxDC& dc = *event.GetDC(); + dc.SetPen(*wxGREEN_PEN); + + PrepareDC( dc ); + + // clear any junk currently displayed + dc.Clear(); + + const wxSize size = GetClientSize(); + 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); + } + + dc.SetTextForeground(*wxRED); + dc.DrawText(_T("This text is drawn from OnEraseBackground"), 60, 160); }