From f9032263ab28c99aa037d3b67068b2a1032e8957 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Fri, 24 Nov 2000 20:19:39 +0000 Subject: [PATCH] Trying to understand wxCanvas. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8812 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- contrib/configure | 6 + contrib/configure.in | 1 + contrib/include/wx/canvas/bbox.h | 2 +- contrib/samples/canvas/Makefile.in | 2 +- contrib/samples/canvas/simple/Makefile.in | 23 + contrib/samples/canvas/simple/mondrian.ico | Bin 0 -> 766 bytes contrib/samples/canvas/simple/mondrian.xpm | 44 ++ contrib/samples/canvas/simple/simple.cpp | 147 ++++ contrib/samples/canvas/simple/simple.h | 76 +++ contrib/samples/canvas/simple/simple.rc | 3 + contrib/samples/canvas/simple/simple.wdr | Bin 0 -> 399 bytes contrib/samples/canvas/simple/smile.xpm | 42 ++ contrib/samples/canvas/test/Makefile.in | 2 + contrib/samples/canvas/test/pat36.bmp | Bin 0 -> 190 bytes contrib/samples/canvas/test/pat4.bmp | Bin 0 -> 630 bytes contrib/samples/canvas/test/test.cpp | 751 ++++++++++++++++----- contrib/samples/canvas/test/test.h | 216 ++++++ contrib/src/canvas/bbox.cpp | 2 +- contrib/src/canvas/canvas.cpp | 6 +- contrib/src/canvas/liner.cpp | 2 +- contrib/src/canvas/polygon.cpp | 4 +- 21 files changed, 1143 insertions(+), 186 deletions(-) create mode 100644 contrib/samples/canvas/simple/Makefile.in create mode 100644 contrib/samples/canvas/simple/mondrian.ico create mode 100644 contrib/samples/canvas/simple/mondrian.xpm create mode 100644 contrib/samples/canvas/simple/simple.cpp create mode 100644 contrib/samples/canvas/simple/simple.h create mode 100644 contrib/samples/canvas/simple/simple.rc create mode 100644 contrib/samples/canvas/simple/simple.wdr create mode 100644 contrib/samples/canvas/simple/smile.xpm create mode 100644 contrib/samples/canvas/test/pat36.bmp create mode 100644 contrib/samples/canvas/test/pat4.bmp create mode 100644 contrib/samples/canvas/test/test.h diff --git a/contrib/configure b/contrib/configure index 4cf145f639..d3786f6abc 100755 --- a/contrib/configure +++ b/contrib/configure @@ -828,12 +828,15 @@ trap 'rm -fr `echo " samples/stc/Makefile samples/canvas/Makefile samples/canvas/test/Makefile + samples/canvas/simple/Makefile samples/gizmos/Makefile samples/gizmos/multicell/Makefile samples/gizmos/splittree/Makefile + samples/xml/Makefile utils/Makefile utils/wxrc/Makefile utils/wxrcedit/Makefile + utils/convertrc/Makefile " | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF diff --git a/contrib/configure.in b/contrib/configure.in index b9f770db7e..d8bee0cfe2 100644 --- a/contrib/configure.in +++ b/contrib/configure.in @@ -53,6 +53,7 @@ AC_OUTPUT([ samples/stc/Makefile samples/canvas/Makefile samples/canvas/test/Makefile + samples/canvas/simple/Makefile samples/gizmos/Makefile samples/gizmos/multicell/Makefile samples/gizmos/splittree/Makefile diff --git a/contrib/include/wx/canvas/bbox.h b/contrib/include/wx/canvas/bbox.h index ef725e9eac..b47c9e3af6 100644 --- a/contrib/include/wx/canvas/bbox.h +++ b/contrib/include/wx/canvas/bbox.h @@ -9,7 +9,7 @@ #include "wx/wx.h" #endif -#include "wxmatrix.h" +#include "wx/matrix.h" #include "wx/geometry.h" enum OVERLAP {_IN,_ON,_OUT}; diff --git a/contrib/samples/canvas/Makefile.in b/contrib/samples/canvas/Makefile.in index bde66ce1ee..8eb2e333c7 100644 --- a/contrib/samples/canvas/Makefile.in +++ b/contrib/samples/canvas/Makefile.in @@ -1,6 +1,6 @@ # $Id$ -CONTRIB_SAMPLES=test +CONTRIB_SAMPLES=test simple all: @for d in $(CONTRIB_SAMPLES); do (cd $$d && $(MAKE)); done diff --git a/contrib/samples/canvas/simple/Makefile.in b/contrib/samples/canvas/simple/Makefile.in new file mode 100644 index 0000000000..1618e568a5 --- /dev/null +++ b/contrib/samples/canvas/simple/Makefile.in @@ -0,0 +1,23 @@ +# +# File: Makefile.in +# Author: Julian Smart +# Created: 2000 +# Updated: +# Copyright: (c) 2000 Julian Smart +# +# "%W% %G%" +# +# Makefile for the multicell example (UNIX). + +top_srcdir = @top_srcdir@/.. +top_builddir = ../../../.. +program_dir = contrib/samples/canvas/simple + +PROGRAM=simple + +OBJECTS=simple.o + +APPEXTRALIBS=$(top_builddir)/lib/libcanvas.@WX_TARGET_LIBRARY_TYPE@ +APPEXTRADEFS=-I$(top_srcdir)/contrib/include + +include $(top_builddir)/src/makeprog.env diff --git a/contrib/samples/canvas/simple/mondrian.ico b/contrib/samples/canvas/simple/mondrian.ico new file mode 100644 index 0000000000000000000000000000000000000000..2310c5d275a87af295d5ea8dc79ea417a5e74c53 GIT binary patch literal 766 zcmZQzU<5)11px*Sc)`TLAO@s0fLH;D9e|jTfdxnc0ZAppend( canvas ); + m_admin->SetActive( canvas ); + + + wxCanvasObjectGroup *root = new wxCanvasObjectGroup(0,0); + root->DeleteContents( TRUE ); + + wxCanvasRect *rect; + + rect = new wxCanvasRect( 120,10,120,140 ); + rect->SetBrush( *wxRED_BRUSH ); + root->Append( rect ); + +/* + wxBitmap bitmap( smile_xpm ); + wxImage image( bitmap ); + + m_smile1 = new wxCanvasImage( image, 0,70,32,32 ); + root->Append( m_smile1 ); + + int i; + for (i = 10; i < 300; i+=10) + { + wxCanvasRect *r = new wxCanvasRect( i,50,3,140 ); + r->SetBrush( *wxRED_BRUSH ); + root->Append( r ); + } + + m_smile2 = new wxCanvasImage( image, 0,110,32,32 ); + root->Append( m_smile2 ); + + for (i = 15; i < 300; i+=10) + { + wxCanvasRect *r = new wxCanvasRect( i,50,3,140 ); + r->SetBrush( *wxRED_BRUSH ); + root->Append( r ); + } +*/ + + canvas->SetRoot( root ); +} + +void MyFrame::CreateMyMenuBar() +{ + wxMenu *file_menu = new wxMenu; + file_menu->Append( ID_QUIT, "Quit...", "Quit program" ); + + wxMenuBar *menu_bar = new wxMenuBar(); + menu_bar->Append( file_menu, "File" ); + + SetMenuBar( menu_bar ); +} + +// WDR: handler implementations for MyFrame + +void MyFrame::OnQuit( wxCommandEvent &event ) +{ + Close( TRUE ); +} + +void MyFrame::OnCloseWindow( wxCloseEvent &event ) +{ + // if ! saved changes -> return + + Destroy(); +} + +//------------------------------------------------------------------------------ +// MyApp +//------------------------------------------------------------------------------ + +IMPLEMENT_APP(MyApp) + +MyApp::MyApp() +{ +} + +bool MyApp::OnInit() +{ + MyFrame *frame = new MyFrame( NULL, -1, "SuperApp", wxPoint(20,20), wxSize(500,340) ); + frame->Show( TRUE ); + + return TRUE; +} + +int MyApp::OnExit() +{ + return 0; +} + diff --git a/contrib/samples/canvas/simple/simple.h b/contrib/samples/canvas/simple/simple.h new file mode 100644 index 0000000000..ab9e6ffb5c --- /dev/null +++ b/contrib/samples/canvas/simple/simple.h @@ -0,0 +1,76 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: simple.h +// Author: XX +// Created: XX/XX/XX +// Copyright: +///////////////////////////////////////////////////////////////////////////// + +#ifndef __simple_H__ +#define __simple_H__ + +#ifdef __GNUG__ + #pragma interface "simple.cpp" +#endif + +// Include wxWindows' headers + +#ifndef WX_PRECOMP + #include +#endif + +#include "wx/canvas/canvas.h" + +//---------------------------------------------------------------------------- +// constants +//---------------------------------------------------------------------------- + +#define ID_QUIT 101 + +// WDR: class declarations + +//---------------------------------------------------------------------------- +// MyFrame +//---------------------------------------------------------------------------- + +class MyFrame: public wxFrame +{ +public: + // constructors and destructors + MyFrame( wxWindow *parent, wxWindowID id, const wxString &title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE ); + +private: + // WDR: method declarations for MyFrame + void CreateMyMenuBar(); + +private: + // WDR: member variable declarations for MyFrame + wxCanvasImage *m_smile1; + wxCanvasImage *m_smile2; + wxCanvasAdmin *m_admin; + +private: + // WDR: handler declarations for MyFrame + void OnQuit( wxCommandEvent &event ); + void OnCloseWindow( wxCloseEvent &event ); + +private: + DECLARE_EVENT_TABLE() +}; + +//---------------------------------------------------------------------------- +// MyApp +//---------------------------------------------------------------------------- + +class MyApp: public wxApp +{ +public: + MyApp(); + + virtual bool OnInit(); + virtual int OnExit(); +}; + +#endif diff --git a/contrib/samples/canvas/simple/simple.rc b/contrib/samples/canvas/simple/simple.rc new file mode 100644 index 0000000000..878f3352fb --- /dev/null +++ b/contrib/samples/canvas/simple/simple.rc @@ -0,0 +1,3 @@ +#include "wx/msw/wx.rc" + + diff --git a/contrib/samples/canvas/simple/simple.wdr b/contrib/samples/canvas/simple/simple.wdr new file mode 100644 index 0000000000000000000000000000000000000000..a225b0d536ad018e8d3eb3f0bd6578b07f2f772d GIT binary patch literal 399 zcmWG{31VbmU|H+&q0;p}vF~0P`J;2C8EKsVL6OEyzjLOD-tD6yZR~XF!7>pt2+* RKM$viK&l{0V2%Qr3ILW~P=^2j literal 0 HcmV?d00001 diff --git a/contrib/samples/canvas/simple/smile.xpm b/contrib/samples/canvas/simple/smile.xpm new file mode 100644 index 0000000000..4773967aa8 --- /dev/null +++ b/contrib/samples/canvas/simple/smile.xpm @@ -0,0 +1,42 @@ +/* XPM */ +static char * smile_xpm[] = { +/* width height ncolors chars_per_pixel */ +"32 32 4 1", +/* colors */ +" s None c None", +". c #000000", +"+ c #ff0000", +"@ c #ffff00", +/* pixels */ +" ........ ", +" ...@@@@@@@@... ", +" ..@@@@@@@@@@@@@@.. ", +" ..@@@@@@@@@@@@@@@@.. ", +" .@@@@@@@@@@@@@@@@@@@@. ", +" .@@@@@@@@@@@@@@@@@@@@@@. ", +" .@@@@@@@@@@@@@@@@@@@@@@@@. ", +" ..@@@@@@@@@@@@@@@@@@@@@@@@.. ", +" .@@@@@@@@ @@@@@@ @@@@@@@@. ", +" .@@@@@@@@ @@@@ @@@@@@@@. ", +" .@@@@@@@@ @@@@ @@@@@@@@. ", +" .@@@@@@@@ @@@@ @@@@@@@@. ", +".@@@@@@@@@ @@@@ @@@@@@@@@.", +".@@@@@@@@@ @@@@ @@@@@@@@@.", +".@@@@@@@@@@ @@@@@@ @@@@@@@@@@.", +".@@@@@@@.@@@@@@@@@@@@@@.@@@@@@@.", +".@@@@@@@.@@@@@@@@@@@@@@.@@@@@@@.", +".@@@@@@.@@@@@@@@@@@@@@@@.@@@@@@.", +".@@@....@@@@@@@@@@@@@@@@....@@@.", +".@@@@@@@.@@@@@@@@@@@@@@.@@@@@@@.", +" .@@@@@@@.@@@@@@@@@@@@.@@@@@@@. ", +" .@@@@@@@..@@@@@@@@@@..@@@@@@@. ", +" .@@@@@@@@...@@@@@@...@@@@@@@@. ", +" .@@@@@@@@.+......+.@@@@@@@@. ", +" ..@@@@@@@@.++++++.@@@@@@@@.. ", +" .@@@@@@@@@.++++.@@@@@@@@@. ", +" .@@@@@@@@@....@@@@@@@@@. ", +" .@@@@@@@@@@@@@@@@@@@@. ", +" ..@@@@@@@@@@@@@@@@.. ", +" ..@@@@@@@@@@@@@@.. ", +" ...@@@@@@@@... ", +" ........ "}; diff --git a/contrib/samples/canvas/test/Makefile.in b/contrib/samples/canvas/test/Makefile.in index bce306e5b6..500d2bdd8a 100644 --- a/contrib/samples/canvas/test/Makefile.in +++ b/contrib/samples/canvas/test/Makefile.in @@ -17,6 +17,8 @@ PROGRAM=test OBJECTS=test.o +DATAFILES = pat4.bmp pat36.bmp + APPEXTRALIBS=$(top_builddir)/lib/libcanvas.@WX_TARGET_LIBRARY_TYPE@ APPEXTRADEFS=-I$(top_srcdir)/contrib/include diff --git a/contrib/samples/canvas/test/pat36.bmp b/contrib/samples/canvas/test/pat36.bmp new file mode 100644 index 0000000000000000000000000000000000000000..861248a50a5ca7190fce9734c5b1ec559245417e GIT binary patch literal 190 zcmYkzu?@mN429umQc&IqN68e4M9)mzWavf-8>CEu^7u_q#FIYTvh3UasXZg@ipx(Z zn56ctdpXfk#&*iQ(9!IT-8<}cz!}wED(mW5le->noa8&UKMV7Wj&=ynhANe!a8bc@ F@CTb}O3?rS literal 0 HcmV?d00001 diff --git a/contrib/samples/canvas/test/pat4.bmp b/contrib/samples/canvas/test/pat4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7e5fe5b2c2a20d2c5e7327fe310b7200305ac5c1 GIT binary patch literal 630 zcmb`EK@P$&3FzqsaDv*KhgezcAJ>31{R{; Nk^jfXL+{^L4_?dnE_(m~ literal 0 HcmV?d00001 diff --git a/contrib/samples/canvas/test/test.cpp b/contrib/samples/canvas/test/test.cpp index d9e9199a98..491be6e47a 100644 --- a/contrib/samples/canvas/test/test.cpp +++ b/contrib/samples/canvas/test/test.cpp @@ -6,275 +6,483 @@ * Copyright: (C) 1998, Robert Roebling * */ -// For compilers that support precompilation, includes "wx/wx.h". -#include "wx/wxprec.h" -#ifdef __BORLANDC__ -#pragma hdrstop +#ifdef __GNUG__ + #pragma implementation "test.cpp" #endif -#ifndef WX_PRECOMP -#include "wx/wx.h" -#endif - -#include -#include -#include -#include -#include "wx/image.h" +// For compilers that support precompilation +#include "wx/wxprec.h" +#ifdef __BORLANDC__ + #pragma hdrstop +#endif +#include "test.h" #include "smile.xpm" -#include "wx/canvas/canvas.h" +//----------------------------------------------------- +// class MywxCanvasObjectRef +//----------------------------------------------------- -// derived classes +BEGIN_EVENT_TABLE(MywxCanvasObjectRef,wxCanvasObjectRef) + EVT_MOUSE_EVENTS( MywxCanvasObjectRef::OnMouseEvent ) +END_EVENT_TABLE() +IMPLEMENT_DYNAMIC_CLASS(MywxCanvasObjectRef, wxCanvasObjectRef) -class MywxCanvasImage: public wxCanvasImage +MywxCanvasObjectRef::MywxCanvasObjectRef(double x, double y,wxCanvasObjectGroup* group) + :wxCanvasObjectRef(x,y,group) { -public: - MywxCanvasImage( const wxImage &image, double x, double y, double w, double h ); - - void MywxCanvasImage::OnMouse(wxMouseEvent &event); - - DECLARE_EVENT_TABLE() -}; +} -BEGIN_EVENT_TABLE(MywxCanvasImage,wxCanvasImage) - EVT_MOUSE_EVENTS( MywxCanvasImage::OnMouse ) -END_EVENT_TABLE() +MywxCanvasObjectRef::MywxCanvasObjectRef() + :wxCanvasObjectRef(0,0,NULL) +{ +} -MywxCanvasImage::MywxCanvasImage( const wxImage &image, double x, double y, double w, double h ) - :wxCanvasImage( image, x, y, w, h ) +MywxCanvasObjectRef::~MywxCanvasObjectRef() { } -void MywxCanvasImage::OnMouse(wxMouseEvent &event) +void MywxCanvasObjectRef::OnMouseEvent(wxMouseEvent &event) { - static int dx=0; - static int dy=0; + if (!m_dragable) + { + event.Skip(); + return; + } + + static double xprev; + static double yprev; + + //new position of the mouse relative within the object + double x = m_admin->DeviceToLogicalX(event.GetX()); + double y = m_admin->DeviceToLogicalY(event.GetY()); - int x = event.GetX(); - int y = event.GetY(); if (event.LeftDown()) - { - dx=x; - dy=y; + { CaptureMouse(); - } + if (m_dragmode != DRAG_REDRAW) + DragStart(); + } else if (event.LeftUp()) { ReleaseMouse(); + if (m_dragmode != DRAG_REDRAW) + DragEnd(); } else if (IsCapturedMouse()) { - Move(m_area.x+x-dx,m_area.y+y-dy); - m_owner->UpdateNow(); + if (m_dragmode != DRAG_REDRAW) + DragRelative(x-xprev,y-yprev); + else + MoveRelative(x-xprev,y-yprev); + m_admin->UpdateNow(); } + xprev=x; + yprev=y; + //well do something extra + if (IsCapturedMouse()) + m_admin->GetActive()->SetCursor(*wxHOURGLASS_CURSOR); + else + m_admin->GetActive()->SetCursor(*wxSTANDARD_CURSOR); } -class MywxCanvasObjectGroupRef: public wxCanvasObjectGroupRef -{ -public: - MywxCanvasObjectGroupRef(double x, double y, wxCanvasObjectGroup* group); - - void OnMouse(wxMouseEvent &event); +//--------------------------------------------------- +// class MyEventHandler +//--------------------------------------------------- - DECLARE_EVENT_TABLE() -}; - -BEGIN_EVENT_TABLE(MywxCanvasObjectGroupRef,wxCanvasObjectGroupRef) - EVT_MOUSE_EVENTS( MywxCanvasObjectGroupRef::OnMouse ) +BEGIN_EVENT_TABLE(MyEventHandler,wxEvtHandler) + EVT_MOUSE_EVENTS( MyEventHandler::OnMouseEvent ) END_EVENT_TABLE() -MywxCanvasObjectGroupRef::MywxCanvasObjectGroupRef(double x, double y,wxCanvasObjectGroup* group) - :wxCanvasObjectGroupRef(x,y,group) +MyEventHandler::MyEventHandler() { } -void MywxCanvasObjectGroupRef::OnMouse(wxMouseEvent &event) +void MyEventHandler::OnMouseEvent(wxMouseEvent &event) { - static int dx=0; - static int dy=0; + wxCanvasObject* obj=(wxCanvasObject*)event.GetEventObject(); + + if (!obj->GetDraggable()) + return; - //new position of object - int x = m_owner->GetDeviceX( event.GetX()); - int y = m_owner->GetDeviceY( event.GetY()); + static double xprev; + static double yprev; + + wxCanvasAdmin* adm=obj->GetAdmin(); + + //new position of the mouse relative within the object + double x = adm->DeviceToLogicalX(event.GetX()); + double y = adm->DeviceToLogicalY(event.GetY()); if (event.LeftDown()) - { - dx=x; - dy=y; - CaptureMouse(); - } + { + obj->CaptureMouse(); + if (obj->GetDragMode() != DRAG_REDRAW) + obj->DragStart(); + } else if (event.LeftUp()) { - ReleaseMouse(); + obj->ReleaseMouse(); + if (obj->GetDragMode() != DRAG_REDRAW) + obj->DragEnd(); } - else if (IsCapturedMouse()) + else if (obj->IsCapturedMouse()) { - Move(m_x+x-dx,m_y+y-dy); - m_owner->UpdateNow(); + if (obj->GetDragMode() != DRAG_REDRAW) + obj->DragRelative(x-xprev,y-yprev); + else + obj->MoveRelative(x-xprev,y-yprev); + adm->UpdateNow(); } + xprev=x; + yprev=y; + //well do something extra + if (obj->IsCapturedMouse()) + obj->GetAdmin()->GetActive()->SetCursor(*wxHOURGLASS_CURSOR); + else + obj->GetAdmin()->GetActive()->SetCursor(*wxSTANDARD_CURSOR); } -class MyFrame; -class MyApp; +//------------------------------------------------ +// class MyFrame +//------------------------------------------------ -// MyFrame - -class MyFrame: public wxFrame -{ -public: - MyFrame(); - ~MyFrame(); - - void OnAbout( wxCommandEvent &event ); - void OnNewFrame( wxCommandEvent &event ); - void OnQuit( wxCommandEvent &event ); - void OnTimer( wxTimerEvent &event ); - - wxCanvas *m_canvas; - wxCanvasObject *m_sm1; - wxCanvasObject *m_sm2; - wxCanvasObject *m_sm3; - wxCanvasObject *m_sm4; - - MywxCanvasObjectGroupRef *m_ref; - MywxCanvasObjectGroupRef *m_ref2; +class MyApp; +class MyCanvas; - wxTimer *m_timer; - wxTextCtrl *m_log; +BEGIN_EVENT_TABLE(MyFrame, wxFrame) + EVT_MENU(SPLIT_VERTICAL, MyFrame::SplitVertical) + EVT_MENU(SPLIT_HORIZONTAL, MyFrame::SplitHorizontal) + EVT_MENU(SPLIT_UNSPLIT, MyFrame::Unsplit) + EVT_MENU(SPLIT_QUIT, MyFrame::Quit) + EVT_MENU(SPLIT_SETMINSIZE, MyFrame::SetMinSize) -private: - DECLARE_DYNAMIC_CLASS(MyFrame) - DECLARE_EVENT_TABLE() -}; + EVT_UPDATE_UI(SPLIT_VERTICAL, MyFrame::UpdateUIVertical) + EVT_UPDATE_UI(SPLIT_HORIZONTAL, MyFrame::UpdateUIHorizontal) + EVT_UPDATE_UI(SPLIT_UNSPLIT, MyFrame::UpdateUIUnsplit) -// MyApp + EVT_MENU (ID_ABOUT, MyFrame::OnAbout) + EVT_TIMER (-1, MyFrame::OnTimer) +END_EVENT_TABLE() -class MyApp: public wxApp +// My frame constructor +MyFrame::MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size): + wxFrame(frame, SPLITTER_FRAME, title, pos, size) { -public: - virtual bool OnInit(); + m_eventhandler =new MyEventHandler(); - const wxString& GetFontPath() const { return m_fontpath; } + wxPathList pathList; + pathList.Add("."); + pathList.Add(".."); -private: - wxString m_fontpath; -}; + wxString path = pathList.FindValidPath("pat36.bmp"); + gs_bmp36_mono.LoadFile(path, wxBITMAP_TYPE_BMP); + wxMask* mask36 = new wxMask(gs_bmp36_mono, *wxBLACK); + /* associate a monochrome mask with this bitmap */ + gs_bmp36_mono.SetMask(mask36); -// main program + CreateStatusBar(2); -IMPLEMENT_APP(MyApp) + // Make a menubar + fileMenu = new wxMenu; + fileMenu->Append(SPLIT_VERTICAL, "Split &Vertically\tCtrl-V", "Split vertically"); + fileMenu->Append(SPLIT_HORIZONTAL, "Split &Horizontally\tCtrl-H", "Split horizontally"); + fileMenu->Append(SPLIT_UNSPLIT, "&Unsplit", "Unsplit"); +// fileMenu->Append(SPLIT_UNSPLIT, "&Unsplit\tCtrl-U", "Unsplit"); + fileMenu->AppendSeparator(); + fileMenu->Append(SPLIT_SETMINSIZE, "Set &min size", "Set minimum pane size"); + fileMenu->AppendSeparator(); + fileMenu->Append(SPLIT_QUIT, "E&xit\tAlt-X", "Exit"); + fileMenu->Append( ID_ABOUT, "&About..."); -// MyFrame -const int ID_QUIT = 108; -const int ID_ABOUT = 109; + menuBar = new wxMenuBar; + menuBar->Append(fileMenu, "&File"); -IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame ) + SetMenuBar(menuBar); -BEGIN_EVENT_TABLE(MyFrame,wxFrame) - EVT_MENU (ID_ABOUT, MyFrame::OnAbout) - EVT_MENU (ID_QUIT, MyFrame::OnQuit) - EVT_TIMER (-1, MyFrame::OnTimer) -END_EVENT_TABLE() + m_splitter = new MySplitterWindow(this, SPLITTER_WINDOW); -MyFrame::MyFrame() - : wxFrame( (wxFrame *)NULL, -1, "wxCanvas sample", - wxPoint(20,20), wxSize(470,460) ) -{ - wxMenu *file_menu = new wxMenu(); - file_menu->Append( ID_ABOUT, "&About..."); - file_menu->AppendSeparator(); - file_menu->Append( ID_QUIT, "E&xit"); + m_canvas1 = new MyCanvas(&m_canvasadmin, m_splitter, CANVAS1, wxPoint(0, 0), wxSize(400, 400),wxHSCROLL|wxVSCROLL); + m_canvas1->SetYaxis(TRUE); + m_canvas1->SetMappingScroll(-300,-300,500,500,false); + m_canvas1->SetScroll(-400,-400,600,600); + m_canvas1->SetColour(wxColour(255, 255, 255) ); + m_canvas1->SetCursor(wxCursor(wxCURSOR_MAGNIFIER)); - wxMenuBar *menu_bar = new wxMenuBar(); - menu_bar->Append(file_menu, "&File"); + m_canvas2 = new MyCanvas(&m_canvasadmin, m_splitter, CANVAS2, wxPoint(0, 0), wxSize(400, 400),wxHSCROLL|wxVSCROLL); + m_canvas2->SetMappingScroll(-100,-100,500,500,false); + m_canvas2->SetScroll(-400,-400,600,600); + m_canvas2->SetColour( wxColour(187, 215, 243) ); + m_canvas2->Show(FALSE); - SetMenuBar( menu_bar ); + m_canvasadmin.Append(m_canvas1); + m_canvasadmin.Append(m_canvas2); + m_canvasadmin.SetActive(m_canvas1); + + m_splitter->Initialize(m_canvas1); + SetStatusText("Min pane size = 0", 1); - CreateStatusBar(2); int widths[] = { -1, 100 }; SetStatusWidths( 2, widths ); - m_canvas = new wxCanvas( this, -1, wxPoint(0,0), wxSize(10,10) ); - - m_canvas->SetArea( 1000,1000 ); - m_canvas->SetColour( 255, 255, 255 ); - + //root group always at 0,0 + m_datatree = new wxCanvasObjectGroup(0,0); + m_datatree->DeleteContents( TRUE ); + m_datatree->SetAdmin(&m_canvasadmin); wxBitmap bitmap( smile_xpm ); wxImage image( bitmap ); - m_sm1 = new wxCanvasImage( image, 0,70,32,32 ); - m_canvas->Append( m_sm1 ); +// m_sm1 = new wxCanvasImage( image, 0,70,32,32 ); +// m_datatree->Append( m_sm1 ); int i; for (i = 10; i < 300; i+=10) { wxCanvasRect *r = new wxCanvasRect( i,50,3,140 ); r->SetBrush( *wxRED_BRUSH ); - m_canvas->Append( r ); + m_datatree->Append( r ); } - m_sm2 = new wxCanvasImage( image, 0,140,24,24 ); - m_canvas->Append( m_sm2 ); + +// m_sm2 = new wxCanvasImage( image, 0,140,24,24 ); +// m_datatree->Append( m_sm2 ); for (i = 15; i < 300; i+=10) - m_canvas->Append( new wxCanvasRect( i,50,3,140 ) ); + { + wxCanvasRect* rec= new wxCanvasRect( i,50,3,140 ); + rec->SetBrush(wxBrush(wxColour(0,10+i,2+i),wxSOLID)); + rec->SetDraggable(FALSE); + m_datatree->Append( rec ); + } - wxButton *button = new wxButton( m_canvas, -1, "Hello", wxPoint(80,50) ); - m_canvas->Append( new wxCanvasControl( button ) ); +/* + wxButton *button = new wxButton( m_canvas1, -1, "Hello", wxPoint(80,50) ); + m_datatree->Append( new wxCanvasControl( button ) ); - m_canvas->Append( new wxCanvasText( "How are you?", 180, 10, + m_datatree->Append( new wxCanvasText( "Hello", 180, 50, + wxGetApp().GetFontPath() + "/times.ttf", 20 ) ); + + m_datatree->Append( new wxCanvasText( "How are you?", 180, 10, wxGetApp().GetFontPath() + "/times.ttf", 8 ) ); - m_canvas->Append( new wxCanvasText( "How are you?", 180, 20, + m_datatree->Append( new wxCanvasText( "How are you?", 180, 20, wxGetApp().GetFontPath() + "/times.ttf", 10 ) ); - m_canvas->Append( new wxCanvasText( "How are you?", 180, 30, + m_datatree->Append( new wxCanvasText( "How are you?", 180, 30, wxGetApp().GetFontPath() + "/times.ttf", 12 ) ); - m_sm3 = new wxCanvasImage( image, 0,210,32,32 ); - m_canvas->Append( m_sm3 ); - + m_datatree->Append( m_sm3 ); +*/ for (i = 10; i < 300; i+=10) - m_canvas->Append( new wxCanvasLine( 10,-15,i,300 ) ); - - m_sm4 = new MywxCanvasImage( image, 0,270,64,32 ); - m_canvas->Append( m_sm4 ); - + m_datatree->Append( new wxCanvasLine( 10,-15,i,300 ) ); +/* + m_sm4 = new wxCanvasImage( image, 0,270,64,32 ); + m_sm4->SetDragMode(DRAG_RECTANGLE); + m_datatree->Append( m_sm4 ); +*/ // m_canvas->Append( new wxCanvasLine( 10,-1500e6,50,300000e6, 0,255,0 ) ); // m_canvas->Append( new wxCanvasLine( 10,-150000,50,300000, 0,255,0 ) ); -/* + //make a group of wxCanvasObjects - wxCanvasObjectGroup* group1 = new wxCanvasObjectGroup(); - group1->Prepend( new wxCanvasLine( 10,-35,50,190 ) ); + wxCanvasObjectGroup* group1 = new wxCanvasObjectGroup(0,0); + + wxCanvasLine* line = new wxCanvasLine( 10,-35,50,190); + line->SetPen(wxPen(wxColour(255,161,5),5,wxDOT_DASH )); + group1->Prepend( line ); group1->Prepend( new wxCanvasImage( image, 4,38,32,32 ) ); - group1->Prepend( new wxCanvasRect(20,-20,50,170,0,20,240 ) ); + wxCanvasRect* rec3 = new wxCanvasRect(20,-20,50,170); + rec3->SetBrush(wxBrush(wxColour(0,120,240),wxSOLID)); + rec3->SetPen(wxPen(wxColour(252,54,252 ),3,wxSOLID)); + group1->Prepend( rec3 ); + + wxCanvasRect* rec2 = new wxCanvasRect(10,20,104,52); + rec2->SetBrush(wxBrush(wxColour(0,240,240),wxSOLID)); + rec2->SetPen(wxPen(wxColour(210,40,50 ),1,wxSOLID)); + group1->Prepend( rec2 ); + + + + wxPoint2DDouble* todraw2 = new wxPoint2DDouble[3]; + todraw2[0].m_x=230; + todraw2[0].m_y=220; + todraw2[1].m_x=300; + todraw2[1].m_y=200; + todraw2[2].m_x=300; + todraw2[2].m_y=300; + wxCanvasPolyline* poly2= new wxCanvasPolyline(3,todraw2); + poly2->SetPen(wxPen(wxColour(200,0,64 ),4,wxDOT)); + m_datatree->Prepend( poly2 ); + + //make another group of wxCanvasObjects - wxCanvasObjectGroup* group2 = new wxCanvasObjectGroup(); + wxCanvasObjectGroup* group2 = new wxCanvasObjectGroup(0,0); group2->Prepend( new wxCanvasImage( image, 60,38,52,32 ) ); - group2->Prepend( new wxCanvasRect(10,20,104,52,10,40,10 ) ); + wxCanvasRect* rr = new wxCanvasRect(10,20,104,52,30); + rr->SetBrush(wxBrush(wxColour(10,17,255),wxHORIZONTAL_HATCH )); + rr->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID)); + group2->Prepend( rr ); + //this a reference to group2 put into group1 - wxCanvasObjectGroupRef* m_subref = new wxCanvasObjectGroupRef(60,50, group2); + MywxCanvasObjectRef* m_subref = new MywxCanvasObjectRef(60,50, group2); + m_subref->SetRotation(35); + m_subref->SetRotation(0); group1->Prepend( m_subref ); - //now make two refrences to group1 into root group of the canvas - m_ref = new MywxCanvasObjectGroupRef(40,200, group1); - m_canvas->Prepend( m_ref ); - m_ref2 = new MywxCanvasObjectGroupRef(80,350, group1); - m_canvas->Prepend( m_ref2 ); -*/ + wxPoint2DDouble* todraw = new wxPoint2DDouble[5]; + todraw[0].m_x=-30; + todraw[0].m_y=-20; + todraw[1].m_x=100; + todraw[1].m_y=0; + todraw[2].m_x=100; + todraw[2].m_y=100; + todraw[3].m_x=50; + todraw[3].m_y=150; + todraw[4].m_x=0; + todraw[4].m_y=100; + + wxCanvasPolygon* poly= new wxCanvasPolygon(5,todraw); + poly->SetBrush(wxBrush(wxColour(100,17,255),wxCROSSDIAG_HATCH )); + poly->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID)); + group1->Prepend( poly ); + + wxPoint2DDouble* todraw4 = new wxPoint2DDouble[4]; + + todraw4[0].m_x=-50; + todraw4[0].m_y=-30; + todraw4[1].m_x=-50; + todraw4[1].m_y=70; + todraw4[2].m_x=150; + todraw4[2].m_y=70; + todraw4[3].m_x=150; + todraw4[3].m_y=-30; + + wxCanvasPolygon* poly5= new wxCanvasPolygon(4,todraw4); + poly5->SetBrush(wxBrush(wxColour(100,17,255),wxCROSSDIAG_HATCH )); +// poly5->SetBrush(wxBrush(wxColour(100,17,255),wxSOLID )); +// poly5->SetPen(wxPen(wxColour(9,115,64 ),1,wxSOLID)); + poly5->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID)); + wxCanvasObjectGroup* group3 = new wxCanvasObjectGroup(0,0); + group3->Prepend( poly5 ); + + wxList* pointlist = new wxList(); + wxPoint2DDouble* point = new wxPoint2DDouble(0,0); + pointlist->Append((wxObject*)point); + point = new wxPoint2DDouble(-300,100); + pointlist->Append((wxObject*)point); + point = new wxPoint2DDouble(-100,100); + pointlist->Append((wxObject*)point); + point = new wxPoint2DDouble(-100,0); + pointlist->Append((wxObject*)point); + point = new wxPoint2DDouble(-200,50); + pointlist->Append((wxObject*)point); + + wxCanvasPolygonL* poly15= new wxCanvasPolygonL(pointlist,TRUE); + poly15->SetColour1(wxColour(250,78,216 )); + poly15->SetColour2(*wxRED); + poly15->SetBrush(wxBrush(gs_bmp36_mono)); + poly15->SetTransParent(TRUE); + poly15->SetPen(wxPen(*wxRED,4,wxSOLID)); + group1->Prepend( poly15 ); + + wxList* pointlist2 = new wxList(); + wxPoint2DDouble* point2 = new wxPoint2DDouble(-400,100); + pointlist2->Append((wxObject*)point2); + point2 = new wxPoint2DDouble(-400,200); + pointlist2->Append((wxObject*)point2); + point2 = new wxPoint2DDouble(0,200); + pointlist2->Append((wxObject*)point2); + point2 = new wxPoint2DDouble(0,100); + pointlist2->Append((wxObject*)point2); + point2 = new wxPoint2DDouble(-200,175); + pointlist2->Append((wxObject*)point2); + + wxCanvasPolylineL* poly16= new wxCanvasPolylineL(pointlist2,TRUE); + poly16->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID)); + m_datatree->Prepend( poly16 ); + + + wxPoint2DDouble* todraw6 = new wxPoint2DDouble[5]; + todraw6[0].m_x=50; + todraw6[0].m_y=305; + todraw6[1].m_x=-200; + todraw6[1].m_y=200; + todraw6[2].m_x=0; + todraw6[2].m_y=500; + todraw6[3].m_x=300; + todraw6[3].m_y=200; + todraw6[4].m_x=-300; + todraw6[4].m_y=-300; + + wxCanvasPolygon* poly17= new wxCanvasPolygon(5,todraw6,TRUE); + poly17->SetBrush(wxBrush(wxColour(100,17,255),wxSOLID)); + poly17->SetPen(wxPen(wxColour(10,17,25),16,wxLONG_DASH )); + poly17->SetColour1(*wxGREEN); + poly17->SetColour2(*wxRED); + poly17->SetGradient(TRUE,wxPen(wxColour(0,0,0),0,wxSOLID),0); + wxCanvasObjectRef* m_refc = new wxCanvasObjectRef(0,-200, poly17); + m_refc->SetRotation(90); + m_datatree->Prepend( m_refc ); + wxCanvasObjectRef* m_refd = new wxCanvasObjectRef(200,-50, poly17); + m_refd->SetRotation(0); + m_datatree->Append( m_refd ); + + //now make two references to group1 into root group of the canvas + m_ref = new MywxCanvasObjectRef(350,-200, group1); + m_ref->SetRotation(25); + //TODO if rotation is 0 scaling is weird +// m_ref->SetScale(2,3.2); + m_datatree->Append( m_ref ); + + group3->Prepend( m_ref ); + + + //this a reference to group2 put into group1 + MywxCanvasObjectRef* subref2 = new MywxCanvasObjectRef(20,130, group2); + subref2->SetRotation(15); + group3->Prepend( subref2 ); + m_datatree->Prepend( subref2 ); + + m_ref2 = new MywxCanvasObjectRef(80,450, group1); + m_ref2->SetRotation(-35); + m_ref2->SetDragMode(DRAG_RECTANGLE); + m_datatree->Prepend( m_ref2 ); + + wxCanvasCircle* cir = new wxCanvasCircle( -100, -150, 100 ); + cir->SetBrush(wxBrush(wxColour(19,215,6),wxHORIZONTAL_HATCH )); + cir->SetPen(wxPen(wxColour(198,3,105 ),30,wxSOLID)); + cir->SetDragMode(DRAG_REDRAW); + m_datatree->Prepend( cir ); + + wxCanvasEllipse* elp = new wxCanvasEllipse( -100, 250, 100,300 ); + elp->SetBrush(wxBrush(wxColour(100,17,55),wxVERTICAL_HATCH )); + elp->SetPen(wxPen(wxColour(2,255,6 ),10,wxDOT)); + m_datatree->Prepend( elp ); + + wxCanvasEllipticArc* aelp = new wxCanvasEllipticArc( -230, 250, 100,300, 30,270 ); + aelp->SetBrush(wxBrush(wxColour(100,17,155),wxSOLID )); + aelp->SetPen(wxPen(wxColour(1,215,6 ),10,wxSOLID)); + m_datatree->Prepend( aelp ); + + //HOW BAD DO THINGS GET + int kk; + for (kk=0;kk<100;kk++) + { +// MywxCanvasObjectRef* m_refx = new MywxCanvasObjectRef(180,50+kk*30, group1); +// m_refx->SetRotation(-35); +// m_datatree->Prepend( m_refx ); + } +/* m_log = new wxTextCtrl( this, -1, "", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE ); wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) ); delete old_log; @@ -286,16 +494,125 @@ MyFrame::MyFrame() SetAutoLayout( TRUE ); SetSizer( topsizer ); +*/ + + //fancy background + wxPoint2DDouble* todraw8 = new wxPoint2DDouble[4]; + todraw8[0].m_x=-350; + todraw8[0].m_y=-350; + todraw8[1].m_x=-350; + todraw8[1].m_y=550; + todraw8[2].m_x=550; + todraw8[2].m_y=550; + todraw8[3].m_x=550; + todraw8[3].m_y=-350; + + wxCanvasPolygon* poly18= new wxCanvasPolygon(4,todraw8); + poly18->SetPen(wxPen(wxColour(10,17,25),16,wxTRANSPARENT )); + poly18->SetColour1(wxColour(0,0,0)); + poly18->SetColour2(wxColour(0,255,255)); + poly18->SetGradient(TRUE,wxPen(wxColour(0,0,0),0,wxSOLID),0); + + wxCanvasObjectRef* m_refb = new wxCanvasObjectRef(200,0, poly18); + m_refb->SetRotation(90); + + m_datatree->Prepend( m_refb ); + +/* + wxCanvasCircle* cir = new wxCanvasCircle( -100, -150, 100 ); + cir->SetBrush(wxBrush(wxColour(19,215,6),wxHORIZONTAL_HATCH )); + cir->SetPen(wxPen(wxColour(198,3,105 ),30,wxSOLID)); + m_datatree->Prepend( cir ); +*/ + m_datatree->SetAdmin(&m_canvasadmin); + m_datatree->AppendEventHandler( m_eventhandler ); + m_canvas1->SetRoot(m_datatree); + + //wxCanvasObjectGroup* group3 = new wxCanvasObjectGroup(0,0); + // group3->Prepend( cir ); + + group3->SetAdmin(&m_canvasadmin); + m_canvas2->SetRoot(group3); m_timer = new wxTimer( this ); - m_timer->Start( 100, FALSE ); + //m_timer->Start( 100, FALSE ); } MyFrame::~MyFrame() { + m_datatree->RemoveLastEventHandler( FALSE ); + delete m_eventhandler; delete m_timer; } +void MyFrame::Quit(wxCommandEvent& WXUNUSED(event) ) +{ + Close(TRUE); +} + +void MyFrame::SplitHorizontal(wxCommandEvent& WXUNUSED(event) ) +{ + if ( m_splitter->IsSplit() ) + m_splitter->Unsplit(); + m_canvas1->Show(TRUE); + m_canvas2->Show(TRUE); + m_splitter->SplitHorizontally( m_canvas1, m_canvas2 ); + UpdatePosition(); +} + +void MyFrame::SplitVertical(wxCommandEvent& WXUNUSED(event) ) +{ + if ( m_splitter->IsSplit() ) + m_splitter->Unsplit(); + m_canvas1->Show(TRUE); + m_canvas2->Show(TRUE); + m_splitter->SplitVertically( m_canvas1, m_canvas2 ); + UpdatePosition(); +} + +void MyFrame::Unsplit(wxCommandEvent& WXUNUSED(event) ) +{ + if ( m_splitter->IsSplit() ) + m_splitter->Unsplit(); + SetStatusText("No splitter"); +} + +void MyFrame::SetMinSize(wxCommandEvent& WXUNUSED(event) ) +{ + wxString str; + str.Printf( _T("%d"), m_splitter->GetMinimumPaneSize()); + str = wxGetTextFromUser("Enter minimal size for panes:", "", str, this); + if ( str.IsEmpty() ) + return; + + int minsize = wxStrtol( str, (wxChar**)NULL, 10 ); + m_splitter->SetMinimumPaneSize(minsize); + str.Printf( _T("Min pane size = %d"), minsize); + SetStatusText(str, 1); +} + +void MyFrame::UpdateUIHorizontal(wxUpdateUIEvent& event) +{ + event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_HORIZONTAL) ) ); +} + +void MyFrame::UpdateUIVertical(wxUpdateUIEvent& event) +{ + event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_VERTICAL) ) ); +} + +void MyFrame::UpdateUIUnsplit(wxUpdateUIEvent& event) +{ + event.Enable( m_splitter->IsSplit() ); +} + +void MyFrame::UpdatePosition() +{ + wxString str; + str.Printf( "Sash position = %d", m_splitter->GetSashPosition()); + SetStatusText(str); +} + void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) { Close( TRUE ); @@ -303,32 +620,111 @@ void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) void MyFrame::OnTimer( wxTimerEvent &WXUNUSED(event) ) { - m_sm1->Move( m_sm1->GetX()+1, m_sm1 ->GetY() ); - m_sm2->Move( m_sm2->GetX()+1, m_sm2->GetY() ); - m_sm3->Move( m_sm3->GetX()+1, m_sm3->GetY() ); - m_sm4->Move( m_sm4->GetX()+2, m_sm4->GetY() ); -/* - m_ref->Move( m_ref->GetPosX()+1, m_ref->GetPosY() ); - m_ref2->Move( m_ref2->GetPosX()+2, m_ref2->GetPosY() ); -*/ - + m_sm1->MoveRelative( 1, 0); + m_sm2->MoveRelative( 1, 0); + m_sm3->MoveRelative( 1, 0); + m_sm4->MoveRelative( 2, 0); + +// m_ref->MoveRelative( 1, 0 ); + m_ref2->MoveRelative( 2, 0 ); + m_canvas1->UpdateNow(); + + wxWakeUpIdle(); } void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) ) { (void)wxMessageBox( "wxCanvas demo\n" - "Robert Roebling (c) 1998,2000", + "Robert Roebling (c) 1998,2000 \n Modified by Klaas Holwerda 2000", "About wxCanvas Demo", wxICON_INFORMATION | wxOK ); } + +//------------------------------------------------ +// class MyCanvas +//------------------------------------------------ + +// the event tables connect the wxWindows events with the functions (event +// handlers) which process them. +BEGIN_EVENT_TABLE(MyCanvas,wxCanvas) + EVT_MOUSE_EVENTS (MyCanvas::OnMouseEvent) +END_EVENT_TABLE() + +MyCanvas::MyCanvas(wxCanvasAdmin* admin, MySplitterWindow *parent, wxWindowID id, + const wxPoint &position, const wxSize& size, long style ) : + wxCanvas( admin, parent, id, position, size, style ) +{ + m_parent=parent; +} + +void MyCanvas::OnMouseEvent(wxMouseEvent& event) +{ + wxClientDC dc(this); + PrepareDC(dc); + + wxPoint pos = event.GetPosition(); + + m_mouse_worldx = DeviceToLogicalX( pos.x ); + m_mouse_worldy = DeviceToLogicalY( pos.y ); + + wxString str; + str.Printf( "Current mouse position: %f,%f", m_mouse_worldx, m_mouse_worldy ); + m_parent->SetStatusText( str ); + + if (!event.m_controlDown && !GetCaptured()) + { + if (event.LeftDown()) + { + m_zoom_x1=m_zoom_x2=pos.x; + m_zoom_y1=m_zoom_y2=pos.y; + } + if (event.RightDown()) + { + SetMappingScroll(m_virtm_minX,m_virtm_minY,m_virtm_maxX,m_virtm_maxY,0); + Update( 0,0, GetBufferWidth(), GetBufferHeight(), TRUE ); + UpdateNow(); + } + if (event.LeftUp()) + { + m_zoom_x2=pos.x; + m_zoom_y2=pos.y; + double x_virt_min=DeviceToLogicalX(m_zoom_x1); + double y_virt_min=DeviceToLogicalY(m_zoom_y2); + double x_virt_max=DeviceToLogicalX(m_zoom_x2); + double y_virt_max=DeviceToLogicalY(m_zoom_y1); + SetMappingScroll(x_virt_min,y_virt_min,x_virt_max,y_virt_max,0); + Update( 0,0, GetBufferWidth(), GetBufferHeight(), TRUE ); + UpdateNow(); + } + if (event.Dragging()&& event.m_leftDown) + { + dc.SetLogicalFunction(wxINVERT); + dc.DrawRectangle(m_zoom_x1,m_zoom_y1,m_zoom_x2-m_zoom_x1,m_zoom_y2-m_zoom_y1 ); + m_zoom_x2=pos.x; + m_zoom_y2=pos.y; + dc.DrawRectangle(m_zoom_x1,m_zoom_y1,m_zoom_x2-m_zoom_x1,m_zoom_y2-m_zoom_y1 ); + } + } + else + { + wxCanvas::OnMouse(event); + } +} + + //----------------------------------------------------------------------------- // MyApp //----------------------------------------------------------------------------- +// main program + +IMPLEMENT_APP(MyApp) + bool MyApp::OnInit() { m_fontpath = getenv("TRUETYPE"); + m_fontpath = "c:/WINNT/Fonts/times.ttf"; if ( !m_fontpath ) { wxLogError("Please set env var TRUETYPE to the path where times.ttf lives."); @@ -341,10 +737,11 @@ bool MyApp::OnInit() wxImage::AddHandler( new wxPNGHandler ); #endif - wxFrame *frame = new MyFrame(); + wxFrame *frame = new MyFrame((wxFrame *) NULL, "wxCanvas Example", wxPoint(0,0), wxSize(400,500)); frame->Show( TRUE ); + SetTopWindow(frame); + return TRUE; } - diff --git a/contrib/samples/canvas/test/test.h b/contrib/samples/canvas/test/test.h new file mode 100644 index 0000000000..3bb2209fe1 --- /dev/null +++ b/contrib/samples/canvas/test/test.h @@ -0,0 +1,216 @@ +/* + * Program: canvas + * + * Author: Robert Roebling + * + * Copyright: (C) 1998, Robert Roebling + * + */ +// For compilers that support precompilation, includes "wx/wx.h". + +#ifndef __test_H__ +#define __test_H__ + +#ifdef __GNUG__ + #pragma interface "test.cpp" +#endif + +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include +#include +#include +#include +#include + +#include "wx/canvas/canvas.h" +#include "wx/canvas/polygon.h" + +class MyCanvas; + +// derived classes +class MywxCanvasObjectRef: public wxCanvasObjectRef +{ + DECLARE_DYNAMIC_CLASS(MywxCanvasObjectRef) + +public: + MywxCanvasObjectRef(); + MywxCanvasObjectRef(double x, double y, wxCanvasObjectGroup* group); + ~MywxCanvasObjectRef(); + + void OnMouseEvent(wxMouseEvent &event); + +private: + DECLARE_EVENT_TABLE() +}; + + +class MyEventHandler: public wxEvtHandler +{ +public: + MyEventHandler(); + + void OnMouseEvent(wxMouseEvent &event); + +private: + + DECLARE_EVENT_TABLE() +}; + + +class MySplitterWindow : public wxSplitterWindow +{ +public: + MySplitterWindow(wxFrame *parent, wxWindowID id) + : wxSplitterWindow(parent, id, wxDefaultPosition, wxDefaultSize, wxSP_3D | wxSP_LIVE_UPDATE) + { + m_frame = parent; + } + + virtual bool OnSashPositionChange(int newSashPosition) + { + if ( !wxSplitterWindow::OnSashPositionChange(newSashPosition) ) + return FALSE; + + wxString str; + str.Printf( _T("Sash position = %d"), newSashPosition); + m_frame->SetStatusText(str); + + return TRUE; + } + + void SetStatusText(const wxString& str ){m_frame->SetStatusText(str);} + +private: + wxFrame *m_frame; +}; + + +// MyFrame +const int ID_ABOUT = 109; + +// MyFrame +class MyFrame: public wxFrame +{ +public: + MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size); + virtual ~MyFrame(); + + // Menu commands + void SplitHorizontal(wxCommandEvent& event); + void SplitVertical(wxCommandEvent& event); + void Unsplit(wxCommandEvent& event); + void SetMinSize(wxCommandEvent& event); + void Quit(wxCommandEvent& event); + + // Menu command update functions + void UpdateUIHorizontal(wxUpdateUIEvent& event); + void UpdateUIVertical(wxUpdateUIEvent& event); + void UpdateUIUnsplit(wxUpdateUIEvent& event); + + void OnAbout( wxCommandEvent &event ); + void OnNewFrame( wxCommandEvent &event ); + void OnQuit( wxCommandEvent &event ); + void OnTimer( wxTimerEvent &event ); + + wxCanvasObject *m_sm1; + wxCanvasObject *m_sm2; + wxCanvasObject *m_sm3; + wxCanvasObject *m_sm4; + + MywxCanvasObjectRef *m_ref; + MywxCanvasObjectRef *m_ref2; + + wxTimer *m_timer; + wxTextCtrl *m_log; + + wxBitmap gs_bmp36_mono; + +private: + + void UpdatePosition(); + + wxMenu* fileMenu; + wxMenuBar* menuBar; + MyCanvas* m_canvas1; + MyCanvas* m_canvas2; + MySplitterWindow* m_splitter; + + wxCanvasAdmin m_canvasadmin; + + wxCanvasObjectGroup* m_datatree; + + DECLARE_EVENT_TABLE() + + MyEventHandler* m_eventhandler; +}; + +// ID for the menu commands +enum +{ + SPLIT_QUIT, + SPLIT_HORIZONTAL, + SPLIT_VERTICAL, + SPLIT_UNSPLIT, + SPLIT_SETMINSIZE +}; + +// Window ids +#define SPLITTER_WINDOW 100 +#define SPLITTER_FRAME 101 +#define CANVAS1 102 +#define CANVAS2 103 + +class MyCanvas: public wxCanvas +{ +public: + MyCanvas( wxCanvasAdmin* admin, MySplitterWindow *parent, wxWindowID id = -1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxScrolledWindowStyle ); + + void OnMouseEvent(wxMouseEvent& event); + +private: + + //mouse position used for displaying it in the statusbar + int m_mouse_x; + //mouse position used for displaying it in the statusbar + int m_mouse_y; + //mouse position used for displaying it in the statusbar + double m_mouse_worldx; + //mouse position used for displaying it in the statusbar + double m_mouse_worldy; + + //mouse position used for zooming + double m_zoom_x1; + //mouse position used for zooming + double m_zoom_y1; + //mouse position used for zooming + double m_zoom_x2; + //mouse position used for zooming + double m_zoom_y2; + + //declare events + DECLARE_EVENT_TABLE() + + //parent of the canvas + MySplitterWindow *m_parent; +}; + +// MyApp + +class MyApp: public wxApp +{ +public: + virtual bool OnInit(); + + const wxString& GetFontPath() const { return m_fontpath; } + +private: + wxString m_fontpath; +}; + +#endif diff --git a/contrib/src/canvas/bbox.cpp b/contrib/src/canvas/bbox.cpp index bc90feee38..227b0d1c33 100644 --- a/contrib/src/canvas/bbox.cpp +++ b/contrib/src/canvas/bbox.cpp @@ -17,7 +17,7 @@ #pragma hdrstop #endif -#include "bbox.h" +#include "wx/canvas/bbox.h" wxBoundingBox::wxBoundingBox() { diff --git a/contrib/src/canvas/canvas.cpp b/contrib/src/canvas/canvas.cpp index f0b3983b5a..12ff75ff0b 100644 --- a/contrib/src/canvas/canvas.cpp +++ b/contrib/src/canvas/canvas.cpp @@ -17,9 +17,9 @@ #pragma hdrstop #endif -#include "canvas.h" -#include "polygon.h" -#include "liner.h" +#include "wx/canvas/canvas.h" +#include "wx/canvas/polygon.h" +#include "wx/canvas/liner.h" #ifdef __WXGTK__ #include diff --git a/contrib/src/canvas/liner.cpp b/contrib/src/canvas/liner.cpp index 02ca1703fb..9ee4607099 100644 --- a/contrib/src/canvas/liner.cpp +++ b/contrib/src/canvas/liner.cpp @@ -12,7 +12,7 @@ Last Update 05-12-1995 #include -#include "liner.h" +#include "wx/canvas/liner.h" wxLine::wxLine( double x1, double y1, double x2, double y2 ) { diff --git a/contrib/src/canvas/polygon.cpp b/contrib/src/canvas/polygon.cpp index efc3269b80..d7b159f683 100644 --- a/contrib/src/canvas/polygon.cpp +++ b/contrib/src/canvas/polygon.cpp @@ -17,8 +17,8 @@ #pragma hdrstop #endif -#include "polygon.h" -#include "liner.h" +#include "wx/canvas/polygon.h" +#include "wx/canvas/liner.h" void ConvertSplinedPolygon(wxList* list, double Aber); void ConvertSplinedPolyline(wxList* list,double Aber); -- 2.45.2