X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c5d0e69d7df31f0fed5a77e1c479c0f8885679c0..cd15bcaf50ead53ccf9d50965312f0dc754affb4:/samples/erase/erase.cpp?ds=sidebyside diff --git a/samples/erase/erase.cpp b/samples/erase/erase.cpp index 5ca9cdb0f4..37fc81bb88 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" +#include "wx/artprov.h" // ---------------------------------------------------------------------------- // resources // ---------------------------------------------------------------------------- // the application icon -#if !defined(__WXMSW__) && !defined(__WXPM__) +#ifndef wxHAS_IMAGES_IN_RESOURCES #include "../sample.xpm" #endif @@ -52,7 +54,7 @@ public: }; -class MyCanvas : public wxScrolledWindow +class MyCanvas : public wxCustomBackgroundWindow { public: MyCanvas(wxFrame *parent); @@ -72,7 +74,6 @@ public: private: void OnPaint( wxPaintEvent &event ); - void OnChar( wxKeyEvent &event ); void OnEraseBackground( wxEraseEvent &event ); void DoPaint(wxDC& dc); @@ -97,7 +98,6 @@ private: } wxBitmap m_bitmap; - wxString m_text; // use wxMemoryDC in OnPaint()? bool m_useBuffer; @@ -141,6 +141,58 @@ private: DECLARE_EVENT_TABLE() }; +class ControlWithTransparency : public wxWindow +{ +public: + ControlWithTransparency(wxWindow *parent, + const wxPoint& pos, + const wxSize& size) + { + wxString reason; + if ( parent->IsTransparentBackgroundSupported(&reason) ) + { + SetBackgroundStyle (wxBG_STYLE_TRANSPARENT); + m_message = "This is custom control with transparency"; + } + else + { + m_message = "Transparency not supported, check tooltip."; + } + + Create (parent, wxID_ANY, pos, size, wxBORDER_NONE); + Connect(wxEVT_PAINT, + wxPaintEventHandler(ControlWithTransparency::OnPaint)); + + if ( !reason.empty() ) + { + // This can be only done now, after creating the window. + SetToolTip(reason); + } + } + +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(m_message, 0, 2); + + // Draw some bitmap/icon to ensure transparent bitmaps are indeed + // transparent on transparent windows + wxBitmap bmp(wxArtProvider::GetBitmap(wxART_WARNING, wxART_MENU)); + wxIcon icon(wxArtProvider::GetIcon(wxART_GOTO_LAST, wxART_MENU)); + dc.DrawBitmap (bmp, GetSize().x - 1 - bmp.GetWidth(), 2); + dc.DrawIcon(icon, GetSize().x - 1 - bmp.GetWidth()-icon.GetWidth(), 2); + } + + wxString m_message; +}; // ---------------------------------------------------------------------------- // constants @@ -222,7 +274,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"); @@ -280,13 +332,13 @@ 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; @@ -302,39 +354,24 @@ MyCanvas::MyCanvas(wxFrame *parent) "right one drawn directly", wxPoint(150, 20)); + new ControlWithTransparency(this, wxPoint(65, 125), wxSize(350, 22)); + SetFocusIgnoringChildren(); SetBackgroundColour(*wxCYAN); } -void MyCanvas::OnChar( wxKeyEvent &event ) -{ -#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) { + PrepareDC(dc); + if ( m_eraseBgInPaint ) { dc.SetBackground(*wxLIGHT_GREY); - dc.Clear(); + + // Erase the entire virtual area, not just the client area. + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(GetBackgroundColour()); + dc.DrawRectangle(GetVirtualSize()); dc.DrawText("Background erased in OnPaint", 65, 110); } @@ -345,20 +382,10 @@ void MyCanvas::DoPaint(wxDC& dc) "display corruption", 65, 110); } - dc.SetBrush( *wxBLACK_BRUSH ); - dc.DrawBitmap( m_bitmap, 20, 20, true ); 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) ) @@ -366,15 +393,11 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) if ( m_useBuffer ) { wxAutoBufferedPaintDC dc(this); - PrepareDC(dc); - DoPaint(dc); } else { wxPaintDC dc(this); - PrepareDC(dc); - DoPaint(dc); } } @@ -398,12 +421,12 @@ void MyCanvas::OnEraseBackground( wxEraseEvent& event ) wxDC& dc = *event.GetDC(); dc.SetPen(*wxGREEN_PEN); - PrepareDC( dc ); - // clear any junk currently displayed dc.Clear(); - const wxSize size = GetClientSize(); + PrepareDC( dc ); + + const wxSize size = GetVirtualSize(); for ( int x = 0; x < size.x; x += 15 ) { dc.DrawLine(x, 0, x, size.y);