Allow saving the drawing sample canvas to a file or clipboard.

This allows to test wxMemoryDC and, under MSW, wxMetafileDC and also can be
used to compare the output of different versions of the sample (possibly from
different ports, too).

Closes #13327.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68305 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-07-19 22:35:45 +00:00
parent 2d770c4f82
commit 8c6b0819ec

View File

@@ -37,6 +37,7 @@
#include "wx/overlay.h" #include "wx/overlay.h"
#include "wx/graphics.h" #include "wx/graphics.h"
#include "wx/filename.h" #include "wx/filename.h"
#include "wx/metafile.h"
#define TEST_CAIRO_EVERYWHERE 0 #define TEST_CAIRO_EVERYWHERE 0
@@ -101,6 +102,8 @@ public:
#if wxUSE_GRAPHICS_CONTEXT #if wxUSE_GRAPHICS_CONTEXT
void OnGraphicContext(wxCommandEvent& event); void OnGraphicContext(wxCommandEvent& event);
#endif #endif
void OnCopy(wxCommandEvent& event);
void OnSave(wxCommandEvent& event);
void OnShow(wxCommandEvent &event); void OnShow(wxCommandEvent &event);
void OnOption(wxCommandEvent &event); void OnOption(wxCommandEvent &event);
@@ -146,6 +149,7 @@ public:
#if wxUSE_GRAPHICS_CONTEXT #if wxUSE_GRAPHICS_CONTEXT
void UseGraphicContext(bool use) { m_useContext = use; Refresh(); } void UseGraphicContext(bool use) { m_useContext = use; Refresh(); }
#endif #endif
template <typename T> void Draw(T& dc);
protected: protected:
enum DrawMode enum DrawMode
@@ -224,6 +228,8 @@ enum
#if wxUSE_GRAPHICS_CONTEXT #if wxUSE_GRAPHICS_CONTEXT
File_GraphicContext, File_GraphicContext,
#endif #endif
File_Copy,
File_Save,
MenuOption_First, MenuOption_First,
@@ -359,6 +365,9 @@ bool MyApp::OnInit()
// still continue, the sample can be used without images too if they're // still continue, the sample can be used without images too if they're
// missing for whatever reason // missing for whatever reason
} }
#if wxUSE_LIBPNG
wxImage::AddHandler( new wxPNGHandler );
#endif
return true; return true;
} }
@@ -1485,7 +1494,12 @@ extern wxGraphicsRenderer* gCairoRenderer;
void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event)) void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event))
{ {
wxPaintDC pdc(this); wxPaintDC pdc(this);
Draw(pdc);
}
template <typename T>
void MyCanvas::Draw(T& pdc)
{
#if wxUSE_GRAPHICS_CONTEXT #if wxUSE_GRAPHICS_CONTEXT
#if TEST_CAIRO_EVERYWHERE #if TEST_CAIRO_EVERYWHERE
wxGCDC gdc; wxGCDC gdc;
@@ -1691,6 +1705,8 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
#if wxUSE_GRAPHICS_CONTEXT #if wxUSE_GRAPHICS_CONTEXT
EVT_MENU (File_GraphicContext, MyFrame::OnGraphicContext) EVT_MENU (File_GraphicContext, MyFrame::OnGraphicContext)
#endif #endif
EVT_MENU (File_Copy, MyFrame::OnCopy)
EVT_MENU (File_Save, MyFrame::OnSave)
EVT_MENU_RANGE(MenuShow_First, MenuShow_Last, MyFrame::OnShow) 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 #if wxUSE_GRAPHICS_CONTEXT
menuFile->Append(File_ShowAlpha, wxT("&Alpha screen\tF10")); menuFile->Append(File_ShowAlpha, wxT("&Alpha screen\tF10"));
#endif #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")); menuFile->Append(File_ShowGradients, wxT("&Gradients screen\tF12"));
#if wxUSE_GRAPHICS_CONTEXT #if wxUSE_GRAPHICS_CONTEXT
menuFile->Append(File_ShowGraphics, wxT("&Graphics screen")); 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")); menuFile->AppendCheckItem(File_GraphicContext, wxT("&Use GraphicContext\tCtrl-Y"), wxT("Use GraphicContext"));
#endif #endif
menuFile->AppendSeparator(); 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->Append(File_About, wxT("&About...\tCtrl-A"), wxT("Show about dialog"));
menuFile->AppendSeparator(); menuFile->AppendSeparator();
menuFile->Append(File_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program")); menuFile->Append(File_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program"));
@@ -1836,6 +1857,38 @@ void MyFrame::OnGraphicContext(wxCommandEvent& event)
} }
#endif #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) void MyFrame::OnShow(wxCommandEvent& event)
{ {
m_canvas->ToShow(event.GetId()); m_canvas->ToShow(event.GetId());