don't forget cards drawn on the canvas; general cleanup (patch 1164209)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33012 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -9,6 +9,14 @@
|
|||||||
// Licence: wxWindows licence
|
// Licence: wxWindows licence
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// For compilers that support precompilation, includes "wx.h".
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
#include "wx/wxprec.h"
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
@@ -22,32 +30,63 @@
|
|||||||
|
|
||||||
#include "wx/image.h"
|
#include "wx/image.h"
|
||||||
#include "wx/numdlg.h"
|
#include "wx/numdlg.h"
|
||||||
|
#include "wx/dynarray.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// application class
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
class MyApp: public wxApp
|
class MyApp: public wxApp
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual bool OnInit();
|
virtual bool OnInit();
|
||||||
|
|
||||||
const wxImage& GetImage() const { return m_image; }
|
const wxImage& GetImage() const { return m_image; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxImage m_image;
|
wxImage m_image;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// data class for cards that need to be rendered
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class MyRenderedCard
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MyRenderedCard(const wxBitmap& bmp, int x, int y)
|
||||||
|
: m_bmp(bmp), m_x(x), m_y(y) { }
|
||||||
|
wxBitmap m_bmp;
|
||||||
|
int m_x, m_y;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Declare a wxArray type to hold MyRenderedCards.
|
||||||
|
WX_DECLARE_OBJARRAY(MyRenderedCard, ArrayOfCards);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// custom canvas control that we can draw on
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
class MyCanvas: public wxScrolledWindow
|
class MyCanvas: public wxScrolledWindow
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MyCanvas(wxWindow* parent);
|
MyCanvas(wxWindow* parent);
|
||||||
|
|
||||||
|
void ClearCards();
|
||||||
|
|
||||||
void OnMouseLeftUp (wxMouseEvent & event);
|
void OnMouseLeftUp (wxMouseEvent & event);
|
||||||
void OnMouseRightUp (wxMouseEvent & event);
|
void OnMouseRightUp (wxMouseEvent & event);
|
||||||
|
void OnPaint (wxPaintEvent & event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
ArrayOfCards m_cards;
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// main frame
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
class MyFrame: public wxFrame
|
class MyFrame: public wxFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -55,27 +94,34 @@ public:
|
|||||||
|
|
||||||
void OnQuit (wxCommandEvent &);
|
void OnQuit (wxCommandEvent &);
|
||||||
void OnAngle(wxCommandEvent &);
|
void OnAngle(wxCommandEvent &);
|
||||||
|
void OnClear(wxCommandEvent &);
|
||||||
|
|
||||||
double m_angle;
|
double m_angle;
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
|
|
||||||
|
private:
|
||||||
|
MyCanvas *m_canvas;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// menu item identifiers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
ID_Quit = 1,
|
ID_Quit = 1,
|
||||||
ID_Angle
|
ID_Angle,
|
||||||
|
ID_Clear
|
||||||
};
|
};
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
|
// ============================================================================
|
||||||
EVT_LEFT_UP (MyCanvas::OnMouseLeftUp)
|
// implementation
|
||||||
EVT_RIGHT_UP (MyCanvas::OnMouseRightUp)
|
// ============================================================================
|
||||||
END_EVENT_TABLE()
|
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
// ----------------------------------------------------------------------------
|
||||||
EVT_MENU (ID_Quit, MyFrame::OnQuit)
|
// application class
|
||||||
EVT_MENU (ID_Angle, MyFrame::OnAngle)
|
// ----------------------------------------------------------------------------
|
||||||
END_EVENT_TABLE()
|
|
||||||
|
|
||||||
IMPLEMENT_APP(MyApp)
|
IMPLEMENT_APP(MyApp)
|
||||||
|
|
||||||
@@ -94,22 +140,111 @@ bool MyApp::OnInit()
|
|||||||
}
|
}
|
||||||
|
|
||||||
MyFrame *frame = new MyFrame (_T("wxWidgets rotate sample"),
|
MyFrame *frame = new MyFrame (_T("wxWidgets rotate sample"),
|
||||||
wxPoint(20,20), wxSize(600,450));
|
wxPoint(20, 20), wxSize(600, 450));
|
||||||
|
|
||||||
frame->Show (true);
|
frame->Show (true);
|
||||||
SetTopWindow (frame);
|
SetTopWindow (frame);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// data class for cards that need to be rendered
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "wx/arrimpl.cpp"
|
||||||
|
WX_DEFINE_OBJARRAY(ArrayOfCards);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// custom canvas control that we can draw on
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
|
||||||
|
EVT_LEFT_UP (MyCanvas::OnMouseLeftUp)
|
||||||
|
EVT_RIGHT_UP (MyCanvas::OnMouseRightUp)
|
||||||
|
EVT_PAINT (MyCanvas::OnPaint)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
MyCanvas::MyCanvas(wxWindow* parent):
|
||||||
|
wxScrolledWindow(parent, wxID_ANY)
|
||||||
|
{
|
||||||
|
SetBackgroundColour (wxColour (0,80,60));
|
||||||
|
ClearBackground();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MyCanvas::ClearCards ()
|
||||||
|
{
|
||||||
|
m_cards.Clear();
|
||||||
|
Refresh(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotate with interpolation and with offset correction
|
||||||
|
void MyCanvas::OnMouseLeftUp (wxMouseEvent & event)
|
||||||
|
{
|
||||||
|
MyFrame* frame = (MyFrame*) GetParent();
|
||||||
|
|
||||||
|
wxPoint offset;
|
||||||
|
const wxImage& img = wxGetApp().GetImage();
|
||||||
|
wxImage img2 = img.Rotate(frame->m_angle,
|
||||||
|
wxPoint(img.GetWidth() / 2, img.GetHeight() / 2), true, &offset);
|
||||||
|
|
||||||
|
// Add the cards to an array to be drawn later in OnPaint()
|
||||||
|
m_cards.Add(new MyRenderedCard(wxBitmap(img2),
|
||||||
|
event.m_x + offset.x, event.m_y + offset.y));
|
||||||
|
Refresh(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// without interpolation, and without offset correction
|
||||||
|
void MyCanvas::OnMouseRightUp (wxMouseEvent & event)
|
||||||
|
{
|
||||||
|
MyFrame* frame = (MyFrame*) GetParent();
|
||||||
|
|
||||||
|
const wxImage& img = wxGetApp().GetImage();
|
||||||
|
wxImage img2 = img.Rotate(frame->m_angle,
|
||||||
|
wxPoint(img.GetWidth() / 2, img.GetHeight() / 2), false);
|
||||||
|
|
||||||
|
// Add the cards to an array to be drawn later in OnPaint()
|
||||||
|
m_cards.Add(new MyRenderedCard(wxBitmap(img2), event.m_x, event.m_y));
|
||||||
|
Refresh(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MyCanvas::OnPaint (wxPaintEvent &)
|
||||||
|
{
|
||||||
|
size_t numCards = m_cards.GetCount();
|
||||||
|
|
||||||
|
wxPaintDC dc(this);
|
||||||
|
dc.BeginDrawing();
|
||||||
|
|
||||||
|
dc.SetTextForeground(wxColour(255, 255, 255));
|
||||||
|
dc.DrawText(wxT("Click on the canvas to draw a card."), 10, 10);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < numCards; i++) {
|
||||||
|
MyRenderedCard & card = m_cards.Item(i);
|
||||||
|
dc.DrawBitmap(card.m_bmp, card.m_x, card.m_y, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
dc.EndDrawing();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// main frame
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||||
|
EVT_MENU (ID_Quit, MyFrame::OnQuit)
|
||||||
|
EVT_MENU (ID_Angle, MyFrame::OnAngle)
|
||||||
|
EVT_MENU (ID_Clear, MyFrame::OnClear)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
||||||
: wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size)
|
: wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size)
|
||||||
{
|
{
|
||||||
m_angle = 0.1;
|
m_angle = 0.1;
|
||||||
|
|
||||||
new MyCanvas(this);
|
m_canvas = new MyCanvas(this);
|
||||||
|
|
||||||
wxMenu *menuFile = new wxMenu;
|
wxMenu *menuFile = new wxMenu;
|
||||||
menuFile->Append (ID_Angle, _T("Set &angle\tCtrl-A"));
|
menuFile->Append (ID_Angle, _T("Set &angle...\tCtrl-A"));
|
||||||
|
menuFile->Append (ID_Clear, _T("&Clear all cards\tCtrl-C"));
|
||||||
menuFile->AppendSeparator();
|
menuFile->AppendSeparator();
|
||||||
menuFile->Append (ID_Quit, _T("E&xit\tAlt-X"));
|
menuFile->Append (ID_Quit, _T("E&xit\tAlt-X"));
|
||||||
|
|
||||||
@@ -137,38 +272,7 @@ void MyFrame::OnQuit (wxCommandEvent &)
|
|||||||
Close (true);
|
Close (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
MyCanvas::MyCanvas(wxWindow* parent):
|
void MyFrame::OnClear (wxCommandEvent &)
|
||||||
wxScrolledWindow(parent, wxID_ANY)
|
|
||||||
{
|
{
|
||||||
SetBackgroundColour (wxColour (0,80,60));
|
m_canvas->ClearCards ();
|
||||||
ClearBackground();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rotate with interpolation and with offset correction
|
|
||||||
void MyCanvas::OnMouseLeftUp (wxMouseEvent & event)
|
|
||||||
{
|
|
||||||
MyFrame* frame = (MyFrame*) GetParent();
|
|
||||||
|
|
||||||
wxPoint offset;
|
|
||||||
const wxImage& img = wxGetApp().GetImage();
|
|
||||||
wxImage img2 = img.Rotate(frame->m_angle, wxPoint(img.GetWidth()/2, img.GetHeight()/2), true, &offset);
|
|
||||||
|
|
||||||
wxBitmap bmp(img2);
|
|
||||||
|
|
||||||
wxClientDC dc (this);
|
|
||||||
dc.DrawBitmap (bmp, event.m_x + offset.x, event.m_y + offset.y, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// without interpolation, and without offset correction
|
|
||||||
void MyCanvas::OnMouseRightUp (wxMouseEvent & event)
|
|
||||||
{
|
|
||||||
MyFrame* frame = (MyFrame*) GetParent();
|
|
||||||
|
|
||||||
const wxImage& img = wxGetApp().GetImage();
|
|
||||||
wxImage img2 = img.Rotate(frame->m_angle, wxPoint(img.GetWidth()/2, img.GetHeight()/2), false);
|
|
||||||
|
|
||||||
wxBitmap bmp(img2);
|
|
||||||
|
|
||||||
wxClientDC dc (this);
|
|
||||||
dc.DrawBitmap (bmp, event.m_x, event.m_y, true);
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user