X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cd9da200285e3c625be91768c9ca61dc218c94d0..4dcfef961d0a83c58951d50471108da4c1262cb3:/samples/drawing/drawing.cpp diff --git a/samples/drawing/drawing.cpp b/samples/drawing/drawing.cpp index 06f587a9a3..c0bd806ac8 100644 --- a/samples/drawing/drawing.cpp +++ b/samples/drawing/drawing.cpp @@ -60,7 +60,8 @@ enum ScreenToShow Show_Lines, Show_Polygons, Show_Mask, - Show_Ops + Show_Ops, + Show_Regions }; // ---------------------------------------------------------------------------- @@ -72,6 +73,7 @@ static wxBitmap gs_bmpNoMask, gs_bmpMask, gs_bmpWithMask, gs_bmp4, + gs_bmp4_mono, gs_bmp36; // ---------------------------------------------------------------------------- @@ -148,12 +150,15 @@ protected: void DrawText(wxDC& dc); void DrawImages(wxDC& dc); void DrawWithLogicalOps(wxDC& dc); + void DrawRegions(wxDC& dc); void DrawDefault(wxDC& dc); private: MyFrame *m_owner; ScreenToShow m_show; + wxBitmap m_smile_bmp; + wxIcon m_std_icon; DECLARE_EVENT_TABLE() }; @@ -176,7 +181,8 @@ enum File_ShowPolygons, File_ShowMask, File_ShowOps, - MenuShow_Last = File_ShowOps, + File_ShowRegions, + MenuShow_Last = File_ShowRegions, MenuOption_First, @@ -238,9 +244,12 @@ bool MyApp::LoadImages() wxString path = pathList.FindValidPath("pat4.bmp"); if ( !path ) return FALSE; + /* 4 colour bitmap */ gs_bmp4.LoadFile(path, wxBITMAP_TYPE_BMP); - wxMask* mask4 = new wxMask(gs_bmp4, *wxBLACK); - gs_bmp4.SetMask(mask4); + /* turn into mono-bitmap */ + gs_bmp4_mono.LoadFile(path, wxBITMAP_TYPE_BMP); + wxMask* mask4 = new wxMask(gs_bmp4_mono, *wxBLACK); + gs_bmp4_mono.SetMask(mask4); path = pathList.FindValidPath("pat36.bmp"); if ( !path ) @@ -310,26 +319,31 @@ BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) EVT_MOTION (MyCanvas::OnMouseMove) END_EVENT_TABLE() +#include "../image/smile.xpm" + MyCanvas::MyCanvas( MyFrame *parent ) : wxScrolledWindow( parent ) { m_owner = parent; m_show = Show_Default; + m_smile_bmp = wxBitmap(smile_xpm); + m_std_icon = wxTheApp->GetStdIcon(wxICON_INFORMATION); } -//draw a polygon and an overlapping rectangle -//is transparent is 1, the fill pattern are made transparent -//is transparent is 2, the fill pattern are made transparent but inversed -//is transparent is 0 the text for and background color will be used to represent/map -//the colors of the monochrome bitmap pixels to the fillpattern +// Draw a polygon and an overlapping rectangle +// If transparent is 1, the fill pattern is made transparent. +// If transparent is 2, the fill pattern is made transparent but inversed +// If is transparent is 0 the text for and background color will be used to represent/map +// the colors of the monochrome bitmap pixels to the fillpattern // -//i miss_used the the menu items for setting so called back and fore ground color -//just to show how the those colors do influence the fillpatterns -//just play with those, -//and with the code -//variations are endless using other logical functions +// I abused the the menu items for setting so called back and fore ground color +// just to show how the those colors do influence the fillpatterns just play +// with those, and with the code variations are endless using other logical +// functions. + void MyCanvas::DrawTestPoly( int x, int y,wxDC &dc,int transparent ) { - wxBrush* brush4 = new wxBrush(gs_bmp4); + wxBrush* brush4 = new wxBrush(gs_bmp4); + wxBrush* brush4_mono = new wxBrush(gs_bmp4_mono); wxBrush* brush36 = new wxBrush(gs_bmp36); wxPoint todraw[5]; @@ -360,20 +374,26 @@ void MyCanvas::DrawTestPoly( int x, int y,wxDC &dc,int transparent ) { case 0: { + dc.SetLogicalFunction(wxCOPY); + dc.SetPen( wxPen( "black", 4, wxSOLID) ); dc.SetBrush( *brush4 ); - dc.SetTextForeground(*wxGREEN); - dc.SetTextBackground(m_owner->m_colourForeground); - dc.SetLogicalFunction(wxCOPY); dc.DrawPolygon(5,todraw,0,0,wxWINDING_RULE); - //don't understand hwo but the outline is also depending on logicalfunction dc.SetPen( wxPen( "red", 4, wxSOLID) ); dc.SetBrush( *brush36 ); dc.SetTextForeground(*wxCYAN); dc.SetTextBackground(m_owner->m_colourBackground); - dc.SetLogicalFunction(wxCOPY); dc.DrawRectangle( x+10, y+10, 200, 200 ); + + dc.SetPen( wxPen( "green", 4, wxSOLID) ); + dc.SetBrush( *brush4_mono ); + dc.SetTextForeground(*wxCYAN); + dc.SetTextBackground(m_owner->m_colourBackground); + dc.DrawRectangle( x+50, y+50, 200, 200 ); + + dc.DrawCircle( x+400, y+50, 130 ); + dc.SetBrush(wxNullBrush); dc.SetPen(wxNullPen); break; @@ -514,6 +534,7 @@ void MyCanvas::DrawTestPoly( int x, int y,wxDC &dc,int transparent ) } delete brush4; + delete brush4_mono; delete brush36; } @@ -572,33 +593,29 @@ void MyCanvas::DrawDefault(wxDC& dc) dc.FloodFill(0, 0, wxColour(255, 0, 0)); #endif // - dc.DrawIcon( wxICON(mondrian), 40, 40 ); - dc.DrawCheckMark(5, 80, 15, 15); dc.DrawCheckMark(25, 80, 30, 30); dc.DrawCheckMark(60, 80, 60, 60); - // this is the test for "blitting bitmap into DC damages selected brush" - // bug - wxIcon icon = wxTheApp->GetStdIcon(wxICON_INFORMATION); - wxCoord rectSize = icon.GetWidth() + 10; + // this is the test for "blitting bitmap into DC damages selected brush" bug + wxCoord rectSize = m_std_icon.GetWidth() + 10; wxCoord x = 100; dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush( *wxGREEN_BRUSH ); dc.DrawRectangle(x, 10, rectSize, rectSize); - dc.DrawBitmap(icon, x + 5, 15, TRUE); + dc.DrawBitmap(m_std_icon, x + 5, 15, TRUE); x += rectSize + 10; dc.DrawRectangle(x, 10, rectSize, rectSize); - dc.DrawIcon(wxTheApp->GetStdIcon(wxICON_INFORMATION), x + 5, 15); + dc.DrawIcon(m_std_icon, x + 5, 15); x += rectSize + 10; dc.DrawRectangle(x, 10, rectSize, rectSize); // test for "transparent" bitmap drawing (it intersects with the last // rectangle above) //dc.SetBrush( *wxTRANSPARENT_BRUSH ); - #include "../image/smile.xpm" - wxBitmap bmp(smile_xpm); - dc.DrawBitmap(bmp, x + rectSize - 20, rectSize - 10, TRUE); + + if (m_smile_bmp.Ok()) + dc.DrawBitmap(m_smile_bmp, x + rectSize - 20, rectSize - 10, TRUE); dc.SetBrush( *wxBLACK_BRUSH ); dc.DrawRectangle( 0, 160, 1000, 300 ); @@ -614,7 +631,6 @@ void MyCanvas::DrawDefault(wxDC& dc) // to the right wxPen pen = *wxRED_PEN; - pen.SetWidth(2); memdc.SetPen(pen); memdc.DrawLine( 10, 5,10, 5 ); memdc.DrawLine( 10,10,11,10 ); @@ -676,6 +692,21 @@ void MyCanvas::DrawDefault(wxDC& dc) dc.DrawLine(400, 170, 400, 210); dc.DrawLine(300, 200, 410, 200); + // a few more tests of this kind + dc.SetPen(*wxRED_PEN); + dc.SetBrush( *wxWHITE_BRUSH ); + dc.DrawRectangle(300, 220, 1, 1); + dc.DrawRectangle(310, 220, 2, 2); + dc.DrawRectangle(320, 220, 3, 3); + dc.DrawRectangle(330, 220, 4, 4); + + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush( *wxWHITE_BRUSH ); + dc.DrawRectangle(300, 230, 1, 1); + dc.DrawRectangle(310, 230, 2, 2); + dc.DrawRectangle(320, 230, 3, 3); + dc.DrawRectangle(330, 230, 4, 4); + // and now for filled rect with outline dc.SetPen(*wxRED_PEN); dc.SetBrush( *wxWHITE_BRUSH ); @@ -717,12 +748,11 @@ void MyCanvas::DrawDefault(wxDC& dc) wxMemoryDC memdc2; memdc2.SelectObject(bitmap2); - memdc2.SetBackground(*wxWHITE_BRUSH); + wxBrush yellowBrush(wxColour(255, 255, 0), wxSOLID); + memdc2.SetBackground(yellowBrush); + memdc2.Clear(); - // Draw a yellow rectangle filling the bitmap - memdc2.SetPen(wxPen(wxColour(255, 255, 0), 1, wxSOLID)); - memdc2.SetBrush(wxBrush(wxColour(255, 255, 0), wxSOLID)); - memdc2.DrawRectangle(0, 0, totalWidth+2, totalHeight+2); // Just to make sure! + wxPen yellowPen(wxColour(255, 255, 0), 1, wxSOLID); // Now draw a white rectangle with red outline. It should // entirely eclipse the yellow background. @@ -736,6 +766,21 @@ void MyCanvas::DrawDefault(wxDC& dc) memdc2.SelectObject(wxNullBitmap); dc.DrawBitmap(bitmap2, 500, 270); + + // Repeat, but draw directly on dc + // Draw a yellow rectangle filling the bitmap + + x = 600; int y = 270; + dc.SetPen(yellowPen); + dc.SetBrush(yellowBrush); + dc.DrawRectangle(x, y, totalWidth, totalHeight); + + // Now draw a white rectangle with red outline. It should + // entirely eclipse the yellow background. + dc.SetPen(*wxRED_PEN); + dc.SetBrush(*wxWHITE_BRUSH); + + dc.DrawRectangle(x, y, totalWidth, totalHeight); } void MyCanvas::DrawText(wxDC& dc) @@ -858,6 +903,37 @@ void MyCanvas::DrawWithLogicalOps(wxDC& dc) } } +void MyCanvas::DrawRegions(wxDC& dc) +{ + dc.SetBrush( *wxWHITE_BRUSH ); + dc.SetPen( *wxTRANSPARENT_PEN ); + dc.DrawRectangle( 10,10,310,310 ); + + dc.SetClippingRegion( 20,20,100,270 ); + + dc.SetBrush( *wxRED_BRUSH ); + dc.DrawRectangle( 10,10,310,310 ); + + dc.SetClippingRegion( 20,20,100,100 ); + + dc.SetBrush( *wxCYAN_BRUSH ); + dc.DrawRectangle( 10,10,310,310 ); + + dc.DestroyClippingRegion(); + dc.SetClippingRegion( 120,30,100,270 ); + + dc.SetBrush( *wxGREY_BRUSH ); + dc.DrawRectangle( 10,10,310,310 ); + + if (m_smile_bmp.Ok()) + { + dc.DrawBitmap( m_smile_bmp, 140, 20, TRUE ); + dc.DrawBitmap( m_smile_bmp, 140, 290, TRUE ); + dc.DrawBitmap( m_smile_bmp, 110, 80, TRUE ); + dc.DrawBitmap( m_smile_bmp, 210, 80, TRUE ); + } +} + void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxPaintDC dc(this); @@ -893,6 +969,10 @@ void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event)) DrawDefault(dc); break; + case Show_Regions: + DrawRegions(dc); + break; + case Show_Text: DrawText(dc); break; @@ -906,8 +986,10 @@ void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event)) case Show_Polygons: DrawTestPoly( 0, 100, dc, 0 ); +/* DrawTestPoly( 33, 500, dc, 1 ); DrawTestPoly( 43, 1000, dc, 2 ); +*/ break; case Show_Mask: @@ -964,6 +1046,7 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) menuFile->Append(File_ShowPolygons, "&Polygons screen\tF4"); menuFile->Append(File_ShowMask, "wx&Mask screen\tF5"); menuFile->Append(File_ShowOps, "&ROP screen\tF6"); + menuFile->Append(File_ShowRegions, "Re&gions screen\tF6"); menuFile->AppendSeparator(); menuFile->Append(File_About, "&About...\tCtrl-A", "Show about dialog"); menuFile->AppendSeparator(); @@ -1044,8 +1127,10 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { wxString msg; - msg.Printf( _T("This is the about dialog of the drawing sample.\n") - _T("Copyright (c) Robert Roebling 1999") + msg.Printf( wxT("This is the about dialog of the drawing sample.\n") + wxT("This sample tests various primitive drawing functions\n") + wxT("without any tests to prevent flicker.\n") + wxT("Copyright (c) Robert Roebling 1999") ); wxMessageBox(msg, "About Drawing", wxOK | wxICON_INFORMATION, this);