Trying to understand wxCanvas.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8812 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2000-11-24 20:19:39 +00:00
parent c8b7a961ff
commit f9032263ab
21 changed files with 1151 additions and 194 deletions

6
contrib/configure vendored
View File

@@ -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 <<EOF
@@ -928,12 +931,15 @@ CONFIG_FILES=\${CONFIG_FILES-"Makefile
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
"}
EOF
cat >> $CONFIG_STATUS <<\EOF

View File

@@ -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

View File

@@ -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};

View File

@@ -1,6 +1,6 @@
# $Id$
CONTRIB_SAMPLES=test
CONTRIB_SAMPLES=test simple
all:
@for d in $(CONTRIB_SAMPLES); do (cd $$d && $(MAKE)); done

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

View File

@@ -0,0 +1,44 @@
/* XPM */
static char *mondrian_xpm[] = {
/* columns rows colors chars-per-pixel */
"32 32 6 1",
" c Black",
". c Blue",
"X c #00bf00",
"o c Red",
"O c Yellow",
"+ c Gray100",
/* pixels */
" ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" "
};

View File

@@ -0,0 +1,147 @@
/////////////////////////////////////////////////////////////////////////////
// Name: simple.cpp
// Author: XX
// Created: XX/XX/XX
// Copyright:
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "simple.cpp"
#endif
// For compilers that support precompilation
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
// Include private headers
#include "simple.h"
// Include icon header
#if defined(__WXGTK__) || defined(__WXMOTIF__)
#include "mondrian.xpm"
#endif
// Include image
#include "smile.xpm"
// WDR: class implementations
//------------------------------------------------------------------------------
// MyFrame
//------------------------------------------------------------------------------
// WDR: event table for MyFrame
BEGIN_EVENT_TABLE(MyFrame,wxFrame)
EVT_MENU(ID_QUIT, MyFrame::OnQuit)
EVT_CLOSE(MyFrame::OnCloseWindow)
END_EVENT_TABLE()
MyFrame::MyFrame( wxWindow *parent, wxWindowID id, const wxString &title,
const wxPoint &position, const wxSize& size, long style ) :
wxFrame( parent, id, title, position, size, style )
{
CreateMyMenuBar();
CreateStatusBar(1);
SetStatusText( "Welcome!" );
SetIcon(wxICON(mondrian));
// wxCanvas from here
m_admin = new wxCanvasAdmin;
wxCanvas *canvas = new wxCanvas( m_admin, this, -1 );
m_admin->Append( 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;
}

View File

@@ -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 <wx/wx.h>
#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

View File

@@ -0,0 +1,3 @@
#include "wx/msw/wx.rc"

Binary file not shown.

View File

@@ -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 */
" ........ ",
" ...@@@@@@@@... ",
" ..@@@@@@@@@@@@@@.. ",
" ..@@@@@@@@@@@@@@@@.. ",
" .@@@@@@@@@@@@@@@@@@@@. ",
" .@@@@@@@@@@@@@@@@@@@@@@. ",
" .@@@@@@@@@@@@@@@@@@@@@@@@. ",
" ..@@@@@@@@@@@@@@@@@@@@@@@@.. ",
" .@@@@@@@@ @@@@@@ @@@@@@@@. ",
" .@@@@@@@@ @@@@ @@@@@@@@. ",
" .@@@@@@@@ @@@@ @@@@@@@@. ",
" .@@@@@@@@ @@@@ @@@@@@@@. ",
".@@@@@@@@@ @@@@ @@@@@@@@@.",
".@@@@@@@@@ @@@@ @@@@@@@@@.",
".@@@@@@@@@@ @@@@@@ @@@@@@@@@@.",
".@@@@@@@.@@@@@@@@@@@@@@.@@@@@@@.",
".@@@@@@@.@@@@@@@@@@@@@@.@@@@@@@.",
".@@@@@@.@@@@@@@@@@@@@@@@.@@@@@@.",
".@@@....@@@@@@@@@@@@@@@@....@@@.",
".@@@@@@@.@@@@@@@@@@@@@@.@@@@@@@.",
" .@@@@@@@.@@@@@@@@@@@@.@@@@@@@. ",
" .@@@@@@@..@@@@@@@@@@..@@@@@@@. ",
" .@@@@@@@@...@@@@@@...@@@@@@@@. ",
" .@@@@@@@@.+......+.@@@@@@@@. ",
" ..@@@@@@@@.++++++.@@@@@@@@.. ",
" .@@@@@@@@@.++++.@@@@@@@@@. ",
" .@@@@@@@@@....@@@@@@@@@. ",
" .@@@@@@@@@@@@@@@@@@@@. ",
" ..@@@@@@@@@@@@@@@@.. ",
" ..@@@@@@@@@@@@@@.. ",
" ...@@@@@@@@... ",
" ........ "};

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

View File

@@ -6,275 +6,483 @@
* Copyright: (C) 1998, Robert Roebling
*
*/
// For compilers that support precompilation, includes "wx/wx.h".
#ifdef __GNUG__
#pragma implementation "test.cpp"
#endif
// For compilers that support precompilation
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include <wx/image.h>
#include <wx/file.h>
#include <wx/timer.h>
#include <wx/log.h>
#include "wx/image.h"
#include "test.h"
#include "smile.xpm"
#include "wx/canvas/canvas.h"
//-----------------------------------------------------
// class MywxCanvasObjectRef
//-----------------------------------------------------
// derived classes
class MywxCanvasImage: public wxCanvasImage
{
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 )
BEGIN_EVENT_TABLE(MywxCanvasObjectRef,wxCanvasObjectRef)
EVT_MOUSE_EVENTS( MywxCanvasObjectRef::OnMouseEvent )
END_EVENT_TABLE()
MywxCanvasImage::MywxCanvasImage( const wxImage &image, double x, double y, double w, double h )
:wxCanvasImage( image, x, y, w, h )
IMPLEMENT_DYNAMIC_CLASS(MywxCanvasObjectRef, wxCanvasObjectRef)
MywxCanvasObjectRef::MywxCanvasObjectRef(double x, double y,wxCanvasObjectGroup* group)
:wxCanvasObjectRef(x,y,group)
{
}
void MywxCanvasImage::OnMouse(wxMouseEvent &event)
MywxCanvasObjectRef::MywxCanvasObjectRef()
:wxCanvasObjectRef(0,0,NULL)
{
static int dx=0;
static int dy=0;
}
MywxCanvasObjectRef::~MywxCanvasObjectRef()
{
}
void MywxCanvasObjectRef::OnMouseEvent(wxMouseEvent &event)
{
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);
//---------------------------------------------------
// class MyEventHandler
//---------------------------------------------------
void OnMouse(wxMouseEvent &event);
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();
//new position of object
int x = m_owner->GetDeviceX( event.GetX());
int y = m_owner->GetDeviceY( event.GetY());
if (!obj->GetDraggable())
return;
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 MyFrame
//------------------------------------------------
class MyApp;
class MyCanvas;
// MyFrame
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)
class MyFrame: public wxFrame
{
public:
MyFrame();
~MyFrame();
EVT_UPDATE_UI(SPLIT_VERTICAL, MyFrame::UpdateUIVertical)
EVT_UPDATE_UI(SPLIT_HORIZONTAL, MyFrame::UpdateUIHorizontal)
EVT_UPDATE_UI(SPLIT_UNSPLIT, MyFrame::UpdateUIUnsplit)
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;
wxTimer *m_timer;
wxTextCtrl *m_log;
private:
DECLARE_DYNAMIC_CLASS(MyFrame)
DECLARE_EVENT_TABLE()
};
// MyApp
class MyApp: public wxApp
{
public:
virtual bool OnInit();
const wxString& GetFontPath() const { return m_fontpath; }
private:
wxString m_fontpath;
};
// main program
IMPLEMENT_APP(MyApp)
// MyFrame
const int ID_QUIT = 108;
const int ID_ABOUT = 109;
IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
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()
MyFrame::MyFrame()
: wxFrame( (wxFrame *)NULL, -1, "wxCanvas sample",
wxPoint(20,20), wxSize(470,460) )
// My frame constructor
MyFrame::MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size):
wxFrame(frame, SPLITTER_FRAME, title, pos, size)
{
wxMenu *file_menu = new wxMenu();
file_menu->Append( ID_ABOUT, "&About...");
file_menu->AppendSeparator();
file_menu->Append( ID_QUIT, "E&xit");
m_eventhandler =new MyEventHandler();
wxMenuBar *menu_bar = new wxMenuBar();
menu_bar->Append(file_menu, "&File");
wxPathList pathList;
pathList.Add(".");
pathList.Add("..");
SetMenuBar( menu_bar );
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);
CreateStatusBar(2);
// 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...");
menuBar = new wxMenuBar;
menuBar->Append(fileMenu, "&File");
SetMenuBar(menuBar);
m_splitter = new MySplitterWindow(this, SPLITTER_WINDOW);
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));
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);
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);
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;
}

View File

@@ -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 <wx/image.h>
#include <wx/file.h>
#include <wx/timer.h>
#include <wx/log.h>
#include <wx/splitter.h>
#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

View File

@@ -17,7 +17,7 @@
#pragma hdrstop
#endif
#include "bbox.h"
#include "wx/canvas/bbox.h"
wxBoundingBox::wxBoundingBox()
{

View File

@@ -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 <gtk/gtk.h>

View File

@@ -12,7 +12,7 @@ Last Update 05-12-1995
#include <stdlib.h>
#include "liner.h"
#include "wx/canvas/liner.h"
wxLine::wxLine( double x1, double y1, double x2, double y2 )
{

View File

@@ -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);