diff --git a/samples/drawing/drawing.cpp b/samples/drawing/drawing.cpp index 7d9060710b..edb821c26b 100644 --- a/samples/drawing/drawing.cpp +++ b/samples/drawing/drawing.cpp @@ -37,6 +37,7 @@ #include "wx/overlay.h" #include "wx/graphics.h" #include "wx/filename.h" +#include "wx/metafile.h" #define TEST_CAIRO_EVERYWHERE 0 @@ -101,6 +102,8 @@ public: #if wxUSE_GRAPHICS_CONTEXT void OnGraphicContext(wxCommandEvent& event); #endif + void OnCopy(wxCommandEvent& event); + void OnSave(wxCommandEvent& event); void OnShow(wxCommandEvent &event); void OnOption(wxCommandEvent &event); @@ -146,6 +149,7 @@ public: #if wxUSE_GRAPHICS_CONTEXT void UseGraphicContext(bool use) { m_useContext = use; Refresh(); } #endif + template void Draw(T& dc); protected: enum DrawMode @@ -224,6 +228,8 @@ enum #if wxUSE_GRAPHICS_CONTEXT File_GraphicContext, #endif + File_Copy, + File_Save, MenuOption_First, @@ -359,6 +365,9 @@ bool MyApp::OnInit() // still continue, the sample can be used without images too if they're // missing for whatever reason } +#if wxUSE_LIBPNG + wxImage::AddHandler( new wxPNGHandler ); +#endif return true; } @@ -1485,7 +1494,12 @@ extern wxGraphicsRenderer* gCairoRenderer; void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxPaintDC pdc(this); + Draw(pdc); +} +template +void MyCanvas::Draw(T& pdc) +{ #if wxUSE_GRAPHICS_CONTEXT #if TEST_CAIRO_EVERYWHERE wxGCDC gdc; @@ -1691,6 +1705,8 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) #if wxUSE_GRAPHICS_CONTEXT EVT_MENU (File_GraphicContext, MyFrame::OnGraphicContext) #endif + EVT_MENU (File_Copy, MyFrame::OnCopy) + EVT_MENU (File_Save, MyFrame::OnSave) EVT_MENU_RANGE(MenuShow_First, MenuShow_Last, MyFrame::OnShow) @@ -1719,7 +1735,7 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) #if wxUSE_GRAPHICS_CONTEXT menuFile->Append(File_ShowAlpha, wxT("&Alpha screen\tF10")); #endif - menuFile->Append(File_ShowSplines, wxT("&Splines screen\tF11")); + menuFile->Append(File_ShowSplines, wxT("Spl&ines screen\tF11")); menuFile->Append(File_ShowGradients, wxT("&Gradients screen\tF12")); #if wxUSE_GRAPHICS_CONTEXT menuFile->Append(File_ShowGraphics, wxT("&Graphics screen")); @@ -1730,6 +1746,11 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) menuFile->AppendCheckItem(File_GraphicContext, wxT("&Use GraphicContext\tCtrl-Y"), wxT("Use GraphicContext")); #endif menuFile->AppendSeparator(); +#if wxUSE_METAFILE && defined(wxMETAFILE_IS_ENH) + menuFile->Append(File_Copy, wxT("Copy to clipboard")); +#endif + menuFile->Append(File_Save, wxT("&Save...\tCtrl-S"), wxT("Save drawing to file")); + menuFile->AppendSeparator(); menuFile->Append(File_About, wxT("&About...\tCtrl-A"), wxT("Show about dialog")); menuFile->AppendSeparator(); menuFile->Append(File_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program")); @@ -1836,6 +1857,38 @@ void MyFrame::OnGraphicContext(wxCommandEvent& event) } #endif +void MyFrame::OnCopy(wxCommandEvent& WXUNUSED(event)) +{ +#if wxUSE_METAFILE && defined(wxMETAFILE_IS_ENH) + wxMetafileDC dc; + if (!dc.IsOk()) + return; + m_canvas->Draw(dc); + wxMetafile *mf = dc.Close(); + if (!mf) + return; + mf->SetClipboard(); + delete mf; +#endif +} + +void MyFrame::OnSave(wxCommandEvent& WXUNUSED(event)) +{ + wxFileDialog dlg(this, wxT("Save as bitmap"), wxT(""), wxT(""), +#if wxUSE_LIBPNG + wxT("PNG image (*.png)|*.png;*.PNG|") +#endif + wxT("Bitmap image (*.bmp)|*.bmp;*.BMP"), + wxFD_SAVE | wxFD_OVERWRITE_PROMPT); + if (dlg.ShowModal() == wxID_OK) + { + wxBitmap bmp(500, 800); + wxMemoryDC mdc(bmp); + m_canvas->Draw(mdc); + bmp.ConvertToImage().SaveFile(dlg.GetPath()); + } +} + void MyFrame::OnShow(wxCommandEvent& event) { m_canvas->ToShow(event.GetId());