From aba99005d2a02461662d1c240886093ad548db4e Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sat, 15 May 1999 13:33:55 +0000 Subject: [PATCH] Started drawing sample. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2469 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/drawing/.cvsignore | 3 + samples/drawing/Makefile | 1 + samples/drawing/Makefile.in | 26 +++ samples/drawing/drawing.cpp | 322 +++++++++++++++++++++++++++++++++++ samples/drawing/mondrian.xpm | 44 +++++ 5 files changed, 396 insertions(+) create mode 100644 samples/drawing/.cvsignore create mode 100644 samples/drawing/Makefile create mode 100644 samples/drawing/Makefile.in create mode 100644 samples/drawing/drawing.cpp create mode 100644 samples/drawing/mondrian.xpm diff --git a/samples/drawing/.cvsignore b/samples/drawing/.cvsignore new file mode 100644 index 0000000000..7957c41216 --- /dev/null +++ b/samples/drawing/.cvsignore @@ -0,0 +1,3 @@ +Linux +linux-gnu +linux \ No newline at end of file diff --git a/samples/drawing/Makefile b/samples/drawing/Makefile new file mode 100644 index 0000000000..bccce53f76 --- /dev/null +++ b/samples/drawing/Makefile @@ -0,0 +1 @@ +include ../../setup/general/makeapp diff --git a/samples/drawing/Makefile.in b/samples/drawing/Makefile.in new file mode 100644 index 0000000000..13014dcdc0 --- /dev/null +++ b/samples/drawing/Makefile.in @@ -0,0 +1,26 @@ +# WXXT base directory +WXBASEDIR=@WXBASEDIR@ + +# set the OS type for compilation +OS=@OS@ +# compile a library only +RULE=bin + +# define library name +BIN_TARGET=drawing +# define library sources +BIN_SRC=\ +drawing.cpp + +#define library objects +BIN_OBJ=\ +drawing.o + +# additional things needed to link +BIN_LINK= + +# additional things needed to compile +ADD_COMPILE= + +# include the definitions now +include ../../../template.mak diff --git a/samples/drawing/drawing.cpp b/samples/drawing/drawing.cpp new file mode 100644 index 0000000000..5caed97f34 --- /dev/null +++ b/samples/drawing/drawing.cpp @@ -0,0 +1,322 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: drawing.cpp +// Purpose: Minimal wxWindows sample +// Author: Robert Roebling +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id$ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- +#ifdef __GNUG__ + #pragma implementation "minimal.cpp" + #pragma interface "minimal.cpp" +#endif + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// for all others, include the necessary headers (this file is usually all you +// need because it includes almost all "standard" wxWindows headers +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +// ---------------------------------------------------------------------------- +// ressources +// ---------------------------------------------------------------------------- +// the application icon +#if defined(__WXGTK__) || defined(__WXMOTIF__) + #include "mondrian.xpm" +#endif + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// Define a new application type, each program should derive a class from wxApp +class MyApp : public wxApp +{ +public: + // override base class virtuals + // ---------------------------- + + // this one is called on application startup and is a good place for the app + // initialization (doing it here and not in the ctor allows to have an error + // return: if OnInit() returns false, the application terminates) + virtual bool OnInit(); +}; + +// Define a new frame type: this is going to be our main frame +class MyFrame : public wxFrame +{ +public: + // ctor(s) + MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); + + // event handlers (these functions should _not_ be virtual) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + void OnPaint(wxPaintEvent &event); + void OnOption(wxCommandEvent &event); + void OnMouseMove(wxMouseEvent &event); + + int m_mapMode; + double m_xUserScale; + double m_yUserScale; + int m_xLogicalOrigin; + int m_yLogicalOrigin; + +private: + // any class wishing to process wxWindows events must use this macro + DECLARE_EVENT_TABLE() +}; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// IDs for the controls and the menu commands +enum +{ + // menu items + Minimal_Quit = 1, + Minimal_About, + + MapMode_Text, + MapMode_Lometric, + MapMode_Twips, + MapMode_Points, + MapMode_Metric, + + UserScale_StretchHoriz, + UserScale_ShrinkHoriz, + UserScale_StretchVertic, + UserScale_ShrinkVertic, + + AxisMirror_Horiz, + AxisMirror_Vertic, + + LogicalOrigin_MoveDown, + LogicalOrigin_MoveUp, + LogicalOrigin_MoveLeft, + LogicalOrigin_MoveRight, + +}; + +// ---------------------------------------------------------------------------- +// event tables and other macros for wxWindows +// ---------------------------------------------------------------------------- + +// the event tables connect the wxWindows events with the functions (event +// handlers) which process them. It can be also done at run-time, but for the +// simple menu events like this the static method is much simpler. +BEGIN_EVENT_TABLE(MyFrame, wxFrame) + + EVT_MOTION (MyFrame::OnMouseMove) + EVT_PAINT (MyFrame::OnPaint) + + EVT_MENU(Minimal_Quit, MyFrame::OnQuit) + EVT_MENU(Minimal_About, MyFrame::OnAbout) + + EVT_MENU(MapMode_Text, MyFrame::OnOption) + EVT_MENU(MapMode_Lometric, MyFrame::OnOption) + EVT_MENU(MapMode_Twips, MyFrame::OnOption) + EVT_MENU(MapMode_Points, MyFrame::OnOption) + EVT_MENU(MapMode_Metric, MyFrame::OnOption) + + EVT_MENU(UserScale_StretchHoriz, MyFrame::OnOption) + EVT_MENU(UserScale_ShrinkHoriz, MyFrame::OnOption) + EVT_MENU(UserScale_StretchVertic, MyFrame::OnOption) + EVT_MENU(UserScale_ShrinkVertic, MyFrame::OnOption) + + EVT_MENU(AxisMirror_Horiz, MyFrame::OnOption) + EVT_MENU(AxisMirror_Vertic, MyFrame::OnOption) + + EVT_MENU(LogicalOrigin_MoveDown, MyFrame::OnOption) + EVT_MENU(LogicalOrigin_MoveUp, MyFrame::OnOption) + EVT_MENU(LogicalOrigin_MoveLeft, MyFrame::OnOption) + EVT_MENU(LogicalOrigin_MoveRight, MyFrame::OnOption) +END_EVENT_TABLE() + +// Create a new application object: this macro will allow wxWindows to create +// the application object during program execution (it's better than using a +// static object for many reasons) and also declares the accessor function +// wxGetApp() which will return the reference of the right type (i.e. MyApp and +// not wxApp) +IMPLEMENT_APP(MyApp) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// the application class +// ---------------------------------------------------------------------------- + +// `Main program' equivalent: the program execution "starts" here +bool MyApp::OnInit() +{ + // Create the main application window + MyFrame *frame = new MyFrame("Minimal wxWindows App", + wxPoint(50, 50), wxSize(450, 340)); + + // Show it and tell the application that it's our main window + // @@@ what does it do exactly, in fact? is it necessary here? + frame->Show(TRUE); + SetTopWindow(frame); + + // success: wxApp::OnRun() will be called which will enter the main message + // loop and the application will run. If we returned FALSE here, the + // application would exit immediately. + return TRUE; +} + +// ---------------------------------------------------------------------------- +// main frame +// ---------------------------------------------------------------------------- + +// frame constructor +MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) + : wxFrame((wxFrame *)NULL, -1, title, pos, size) +{ + // set the frame icon + SetIcon(wxICON(mondrian)); + + wxMenu *menuFile = new wxMenu; + menuFile->Append(Minimal_About, "&About...\tCtrl-A", "Show about dialog"); + menuFile->AppendSeparator(); + menuFile->Append(Minimal_Quit, "E&xit\tAlt-X", "Quit this program"); + + wxMenu *menuMapMode = new wxMenu; + menuMapMode->Append( MapMode_Text, "&TEXT map mode" ); + menuMapMode->Append( MapMode_Lometric, "&LOMETRIC map mode" ); + menuMapMode->Append( MapMode_Twips, "T&WIPS map mode" ); + menuMapMode->Append( MapMode_Points, "&POINTS map mode" ); + menuMapMode->Append( MapMode_Metric, "&METRIC map mode" ); + + wxMenu *menuUserScale = new wxMenu; + menuUserScale->Append( UserScale_StretchHoriz, "Stretch horizontally\tAlt-P" ); + menuUserScale->Append( UserScale_ShrinkHoriz, "Shrink horizontally\tAlt-M" ); + menuUserScale->Append( UserScale_StretchVertic, "Stretch vertically\tCtrl-P" ); + menuUserScale->Append( UserScale_ShrinkVertic, "Shrink vertically\tCtrl-M" ); + + wxMenu *menuAxis = new wxMenu; + menuAxis->Append( AxisMirror_Horiz, "Mirror horizontally" ); + menuAxis->Append( AxisMirror_Vertic, "Mirror vertically" ); + + wxMenu *menuLogical = new wxMenu; + menuLogical->Append( LogicalOrigin_MoveDown, "Move &down\tCtrl-D" ); + menuLogical->Append( LogicalOrigin_MoveUp, "Move &up\tCtrl-U" ); + menuLogical->Append( LogicalOrigin_MoveLeft, "Move &right\tCtrl-L" ); + menuLogical->Append( LogicalOrigin_MoveRight, "Move &left\tCtrl-R" ); + + // now append the freshly created menu to the menu bar... + wxMenuBar *menuBar = new wxMenuBar; + menuBar->Append(menuFile, "&File"); + menuBar->Append(menuMapMode, "&MapMode"); + menuBar->Append(menuUserScale, "&UserScale"); + menuBar->Append(menuAxis, "&Axis"); + menuBar->Append(menuLogical, "&LogicalOrigin"); + + // ... and attach this menu bar to the frame + SetMenuBar(menuBar); + + // create a status bar just for fun (by default with 1 pane only) + CreateStatusBar(2); + SetStatusText("Welcome to wxWindows!"); + + m_mapMode = wxMM_TEXT; + m_xUserScale = 1.0; + m_yUserScale = 1.0; + m_xLogicalOrigin = 0; + m_yLogicalOrigin = 0; +} + + +// event handlers + +void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) +{ + // TRUE is to force the frame to close + Close(TRUE); +} + +void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) +{ + wxString msg; + msg.Printf( _T("This is the about dialog of the drawing sample.\n") + _T("Welcome to %s") +#ifdef wxBETA_NUMBER + _T(" (beta %d)!") +#endif // wxBETA_NUMBER + , wxVERSION_STRING +#ifdef wxBETA_NUMBER + , wxBETA_NUMBER +#endif // wxBETA_NUMBER + ); + + wxMessageBox(msg, "About Drawing", wxOK | wxICON_INFORMATION, this); +} + +void MyFrame::OnOption(wxCommandEvent &event) +{ + switch (event.GetInt()) + { + case MapMode_Text: + m_mapMode = wxMM_LOMETRIC; + break; + case MapMode_Lometric: + m_mapMode = wxMM_LOMETRIC; + break; + case MapMode_Twips: + m_mapMode = wxMM_TWIPS; + break; + case MapMode_Points: + m_mapMode = wxMM_POINTS; + break; + case MapMode_Metric: + m_mapMode = wxMM_METRIC; + break; + } + Refresh(); +} + +void MyFrame::OnPaint(wxPaintEvent &WXUNUSED(event) ) +{ + wxPaintDC dc(this); + dc.SetMapMode( m_mapMode ); + dc.SetUserScale( m_xUserScale, m_yUserScale ); + dc.SetLogicalOrigin( m_xLogicalOrigin, m_yLogicalOrigin ); + + dc.DrawRectangle( 10, 10, 90, 90 ); + + dc.DrawRoundedRectangle( 10, 110, 90, 90, 5 ); +} + +void MyFrame::OnMouseMove(wxMouseEvent &event) +{ + wxClientDC dc(this); + dc.SetMapMode( m_mapMode ); + dc.SetUserScale( m_xUserScale, m_yUserScale ); + dc.SetLogicalOrigin( m_xLogicalOrigin, m_yLogicalOrigin ); + + wxPoint pos = event.GetPosition(); + long x = dc.DeviceToLogicalX( pos.x ); + long y = dc.DeviceToLogicalY( pos.y ); + wxString str; + str.Printf( "Current mouse position: %d,%d", (int)x, (int)y ); + SetStatusText( str ); +} diff --git a/samples/drawing/mondrian.xpm b/samples/drawing/mondrian.xpm new file mode 100644 index 0000000000..409f27a843 --- /dev/null +++ b/samples/drawing/mondrian.xpm @@ -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 ++++ ", +" " +}; -- 2.45.2