X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9c61c5b04b0b023eb9592bde5633c2111f1940fb..a7ba5d1efbd9bcaa39d47d7752c0382bd220a42f:/samples/erase/erase.cpp?ds=sidebyside diff --git a/samples/erase/erase.cpp b/samples/erase/erase.cpp index cc6ca65d4f..6600a1125c 100644 --- a/samples/erase/erase.cpp +++ b/samples/erase/erase.cpp @@ -30,14 +30,16 @@ #include "wx/wx.h" #endif +#include "wx/custombgwin.h" #include "wx/dcbuffer.h" // ---------------------------------------------------------------------------- // resources // ---------------------------------------------------------------------------- + // the application icon -#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__) - #include "mondrian.xpm" +#if !defined(__WXMSW__) && !defined(__WXPM__) + #include "../sample.xpm" #endif // ---------------------------------------------------------------------------- @@ -51,7 +53,7 @@ public: }; -class MyCanvas : public wxScrolledWindow +class MyCanvas : public wxCustomBackgroundWindow { public: MyCanvas(wxFrame *parent); @@ -59,20 +61,52 @@ public: void UseBuffer(bool useBuffer) { m_useBuffer = useBuffer; Refresh(); } bool UsesBuffer() const { return m_useBuffer; } + void UseBgBitmap(bool useBgBmp) + { + m_useBgBmp = useBgBmp; + SetBackgroundBitmap(m_useBgBmp ? GetBgBitmap() : wxBitmap()); + + Refresh(); + } + + void EraseBgInPaint(bool erase) { m_eraseBgInPaint = erase; Refresh(); } + private: void OnPaint( wxPaintEvent &event ); - void OnChar( wxKeyEvent &event ); void OnEraseBackground( wxEraseEvent &event ); void DoPaint(wxDC& dc); + // Create an easily recognizable background bitmap. + static wxBitmap GetBgBitmap() + { + static const int BMP_SIZE = 40; + + wxBitmap bmp(BMP_SIZE, BMP_SIZE); + wxMemoryDC dc(bmp); + dc.SetBackground(*wxCYAN); + dc.Clear(); + + dc.SetPen(*wxBLUE_PEN); + dc.DrawLine(0, BMP_SIZE/2, BMP_SIZE/2, 0); + dc.DrawLine(BMP_SIZE/2, 0, BMP_SIZE, BMP_SIZE/2); + dc.DrawLine(BMP_SIZE, BMP_SIZE/2, BMP_SIZE/2, BMP_SIZE); + dc.DrawLine(BMP_SIZE/2, BMP_SIZE, 0, BMP_SIZE/2); + + return bmp; + } wxBitmap m_bitmap; - wxString m_text; // use wxMemoryDC in OnPaint()? bool m_useBuffer; + // use background bitmap? + bool m_useBgBmp; + + // erase background in OnPaint()? + bool m_eraseBgInPaint; + DECLARE_EVENT_TABLE() }; @@ -84,6 +118,8 @@ public: private: void OnUseBuffer(wxCommandEvent& event); + void OnUseBgBitmap(wxCommandEvent& event); + void OnEraseBgInPaint(wxCommandEvent& event); void OnChangeBgStyle(wxCommandEvent& event); void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); @@ -104,6 +140,34 @@ private: DECLARE_EVENT_TABLE() }; +class ControlWithTransparency : public wxWindow +{ +public: + ControlWithTransparency(wxWindow *parent, + const wxPoint& pos, + const wxSize& size) + : wxWindow(parent, wxID_ANY, pos, size, wxBORDER_NONE) + { + Connect(wxEVT_PAINT, + wxPaintEventHandler(ControlWithTransparency::OnPaint)); + } + + virtual bool HasTransparentBackground() { return true; } + +private: + void OnPaint( wxPaintEvent& WXUNUSED(event) ) + { + wxPaintDC dc(this); + + dc.SetPen(*wxRED_PEN); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(GetClientSize()); + + dc.SetTextForeground(*wxBLUE); + dc.SetBackgroundMode(wxTRANSPARENT); + dc.DrawText("This is custom control with transparency", 0, 2); + } +}; // ---------------------------------------------------------------------------- // constants @@ -113,6 +177,8 @@ enum { // menu items Erase_Menu_UseBuffer = 100, + Erase_Menu_UseBgBitmap, + Erase_Menu_EraseBgInPaint, Erase_Menu_BgStyleErase, Erase_Menu_BgStyleSystem, Erase_Menu_BgStylePaint, @@ -144,7 +210,9 @@ bool MyApp::OnInit() // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU(Erase_Menu_UseBuffer, MyFrame::OnUseBuffer) + EVT_MENU(Erase_Menu_UseBuffer, MyFrame::OnUseBuffer) + EVT_MENU(Erase_Menu_UseBgBitmap, MyFrame::OnUseBgBitmap) + EVT_MENU(Erase_Menu_EraseBgInPaint, MyFrame::OnEraseBgInPaint) EVT_MENU_RANGE(Erase_Menu_BgStyleErase, Erase_Menu_BgStylePaint, MyFrame::OnChangeBgStyle) @@ -161,10 +229,14 @@ MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, "Erase sample", wxPoint(50, 50), wxSize(450, 340)) { - SetIcon(wxICON(mondrian)); + SetIcon(wxICON(sample)); wxMenu *menuFile = new wxMenu("", wxMENU_TEAROFF); menuFile->AppendCheckItem(Erase_Menu_UseBuffer, "&Use memory DC\tCtrl-M"); + menuFile->AppendCheckItem(Erase_Menu_UseBgBitmap, + "Use background &bitmap\tCtrl-B"); + menuFile->AppendCheckItem(Erase_Menu_EraseBgInPaint, + "&Erase background in EVT_PAINT\tCtrl-R"); menuFile->AppendSeparator(); menuFile->AppendRadioItem(Erase_Menu_BgStyleErase, "Use wxBG_STYLE_&ERASE\tCtrl-E"); @@ -177,7 +249,7 @@ MyFrame::MyFrame() wxMenu *helpMenu = new wxMenu; - helpMenu->Append(Erase_Menu_About, "&About...\tCtrl-A", "Show about dialog"); + helpMenu->Append(Erase_Menu_About, "&About\tCtrl-A", "Show about dialog"); wxMenuBar *menuBar = new wxMenuBar(); menuBar->Append(menuFile, "&File"); @@ -194,6 +266,16 @@ void MyFrame::OnUseBuffer(wxCommandEvent& event) m_canvas->UseBuffer(event.IsChecked()); } +void MyFrame::OnUseBgBitmap(wxCommandEvent& event) +{ + m_canvas->UseBgBitmap(event.IsChecked()); +} + +void MyFrame::OnEraseBgInPaint(wxCommandEvent& event) +{ + m_canvas->EraseBgInPaint(event.IsChecked()); +} + void MyFrame::OnChangeBgStyle(wxCommandEvent& event) { int style = wxBG_STYLE_ERASE + event.GetId() - Erase_Menu_BgStyleErase; @@ -225,65 +307,54 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) EVT_PAINT(MyCanvas::OnPaint) - EVT_CHAR(MyCanvas::OnChar) EVT_ERASE_BACKGROUND(MyCanvas::OnEraseBackground) END_EVENT_TABLE() MyCanvas::MyCanvas(wxFrame *parent) - : wxScrolledWindow(parent, wxID_ANY) { + Create(parent, wxID_ANY); + m_useBuffer = false; + m_useBgBmp = false; + m_eraseBgInPaint = false; SetScrollbars( 10, 10, 40, 100, 0, 0 ); - m_bitmap = wxBitmap( wxICON(mondrian) ); + m_bitmap = wxBitmap( wxICON(sample) ); new wxStaticBitmap( this, wxID_ANY, m_bitmap, wxPoint(80,20) ); + new wxStaticText(this, wxID_ANY, + "Left bitmap is a wxStaticBitmap,\n" + "right one drawn directly", + wxPoint(150, 20)); + + new ControlWithTransparency(this, wxPoint(65, 125), wxSize(300, 22)); + SetFocusIgnoringChildren(); - SetBackgroundColour(*wxBLUE); + SetBackgroundColour(*wxCYAN); } -void MyCanvas::OnChar( wxKeyEvent &event ) +void MyCanvas::DoPaint(wxDC& dc) { -#if wxUSE_UNICODE - if (event.m_uniChar) + if ( m_eraseBgInPaint ) { - m_text += event.m_uniChar; - Refresh(); - return; - } -#endif + dc.SetBackground(*wxLIGHT_GREY); + dc.Clear(); - // some test cases - switch (event.m_keyCode) + dc.DrawText("Background erased in OnPaint", 65, 110); + } + else if ( GetBackgroundStyle() == wxBG_STYLE_PAINT ) { - 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; + dc.SetTextForeground(*wxRED); + dc.DrawText("You must enable erasing background in OnPaint to avoid " + "display corruption", 65, 110); } -} - -void MyCanvas::DoPaint(wxDC& dc) -{ - dc.SetBrush( *wxBLACK_BRUSH ); - dc.DrawRectangle( 10,10,60,50 ); dc.DrawBitmap( m_bitmap, 20, 20, true ); - dc.SetTextForeground(*wxWHITE); + dc.SetTextForeground(*wxRED); dc.DrawText("This text is drawn from OnPaint", 65, 65); - - wxString tmp; - tmp.Printf("Hit any key to display more text: %s", m_text); - - int w,h; - dc.GetTextExtent( tmp, &w, &h ); - dc.DrawRectangle( 65, 85, w, h ); - dc.DrawText( tmp, 65, 85 ); } void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) @@ -306,6 +377,14 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) void MyCanvas::OnEraseBackground( wxEraseEvent& event ) { + // We must not erase the background ourselves if we asked wxPanel to erase + // it using a background bitmap. + if ( m_useBgBmp ) + { + event.Skip(); + return; + } + wxASSERT_MSG ( GetBackgroundStyle() == wxBG_STYLE_ERASE,