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:
@@ -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());
|
||||||
|
Reference in New Issue
Block a user