]> git.saurik.com Git - wxWidgets.git/blame - samples/drawing/drawing.cpp
Oh well..
[wxWidgets.git] / samples / drawing / drawing.cpp
CommitLineData
aba99005
RR
1/////////////////////////////////////////////////////////////////////////////
2// Name: drawing.cpp
0f0c61d0 3// Purpose: shows and tests wxDC features
aba99005
RR
4// Author: Robert Roebling
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Robert Roebling
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
568708e2 19
aba99005 20#ifdef __GNUG__
0f0c61d0
VZ
21 #pragma implementation "drawing.cpp"
22 #pragma interface "drawing.cpp"
aba99005
RR
23#endif
24
25// For compilers that support precompilation, includes "wx/wx.h".
26#include "wx/wxprec.h"
27
28#ifdef __BORLANDC__
29 #pragma hdrstop
30#endif
31
32// for all others, include the necessary headers (this file is usually all you
33// need because it includes almost all "standard" wxWindows headers
34#ifndef WX_PRECOMP
35 #include "wx/wx.h"
36#endif
37
0f0c61d0 38#include "wx/colordlg.h"
107a1787 39#include "wx/image.h"
0f0c61d0 40
aba99005
RR
41// ----------------------------------------------------------------------------
42// ressources
43// ----------------------------------------------------------------------------
568708e2 44
aba99005
RR
45// the application icon
46#if defined(__WXGTK__) || defined(__WXMOTIF__)
47 #include "mondrian.xpm"
48#endif
49
568708e2
VZ
50// ----------------------------------------------------------------------------
51// constants
52// ----------------------------------------------------------------------------
53
54// what do we show on screen (there are too many shapes to put them all on
55// screen simultaneously)
56enum ScreenToShow
57{
58 Show_Default,
59 Show_Text,
60 Show_Lines,
61 Show_Polygons,
81278df2 62 Show_Mask,
bc3cedfa
RR
63 Show_Ops,
64 Show_Regions
568708e2
VZ
65};
66
67// ----------------------------------------------------------------------------
68// global variables
69// ----------------------------------------------------------------------------
70
71static wxBitmap gs_bmpNoMask,
72 gs_bmpWithColMask,
73 gs_bmpMask,
74 gs_bmpWithMask,
75 gs_bmp4,
76 gs_bmp36;
77
aba99005
RR
78// ----------------------------------------------------------------------------
79// private classes
80// ----------------------------------------------------------------------------
81
82// Define a new application type, each program should derive a class from wxApp
83class MyApp : public wxApp
84{
85public:
86 // override base class virtuals
87 // ----------------------------
88
89 // this one is called on application startup and is a good place for the app
90 // initialization (doing it here and not in the ctor allows to have an error
91 // return: if OnInit() returns false, the application terminates)
92 virtual bool OnInit();
568708e2
VZ
93
94protected:
95 bool LoadImages();
aba99005
RR
96};
97
b62c3631
RR
98class MyCanvas;
99
aba99005
RR
100// Define a new frame type: this is going to be our main frame
101class MyFrame : public wxFrame
102{
103public:
104 // ctor(s)
105 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
106
107 // event handlers (these functions should _not_ be virtual)
108 void OnQuit(wxCommandEvent& event);
109 void OnAbout(wxCommandEvent& event);
568708e2 110 void OnShow(wxCommandEvent &event);
aba99005 111 void OnOption(wxCommandEvent &event);
aba99005 112
220af862
VZ
113 wxColour SelectColour();
114 void PrepareDC(wxDC& dc);
0f0c61d0 115
b62c3631 116 int m_backgroundMode;
1edc9f45 117 int m_textureBackground;
b62c3631
RR
118 int m_mapMode;
119 double m_xUserScale;
120 double m_yUserScale;
121 int m_xLogicalOrigin;
122 int m_yLogicalOrigin;
123 bool m_xAxisReversed,
124 m_yAxisReversed;
125 wxColour m_colourForeground, // these are _text_ colours
126 m_colourBackground;
127 wxBrush m_backgroundBrush;
128 MyCanvas *m_canvas;
aba99005
RR
129
130private:
131 // any class wishing to process wxWindows events must use this macro
132 DECLARE_EVENT_TABLE()
133};
134
b62c3631
RR
135// define a scrollable canvas for drawing onto
136class MyCanvas: public wxScrolledWindow
137{
138public:
139 MyCanvas( MyFrame *parent );
1e7fd311 140
b62c3631 141 void OnPaint(wxPaintEvent &event);
bf0c00c6 142 void OnMouseMove(wxMouseEvent &event);
4786aabd 143
568708e2
VZ
144 void Show(ScreenToShow show) { m_show = show; Refresh(); }
145
b62c3631 146protected:
568708e2
VZ
147 void DrawTestPoly( int x, int y, wxDC &dc ,int transparent );
148 void DrawTestLines( int x, int y, int width, wxDC &dc );
149 void DrawText(wxDC& dc);
150 void DrawImages(wxDC& dc);
81278df2 151 void DrawWithLogicalOps(wxDC& dc);
bc3cedfa 152 void DrawRegions(wxDC& dc);
568708e2 153 void DrawDefault(wxDC& dc);
4786aabd 154
b62c3631 155private:
568708e2
VZ
156 MyFrame *m_owner;
157
158 ScreenToShow m_show;
0e09f76e
RR
159 wxBitmap m_smile_bmp;
160 wxIcon m_std_icon;
568708e2 161
b62c3631
RR
162 DECLARE_EVENT_TABLE()
163};
164
aba99005
RR
165// ----------------------------------------------------------------------------
166// constants
167// ----------------------------------------------------------------------------
168
169// IDs for the controls and the menu commands
170enum
171{
172 // menu items
568708e2
VZ
173 File_Quit = 1,
174 File_About,
175
176 MenuShow_First,
177 File_ShowDefault = MenuShow_First,
178 File_ShowText,
179 File_ShowLines,
180 File_ShowPolygons,
181 File_ShowMask,
81278df2 182 File_ShowOps,
bc3cedfa
RR
183 File_ShowRegions,
184 MenuShow_Last = File_ShowRegions,
0f0c61d0
VZ
185
186 MenuOption_First,
187
188 MapMode_Text = MenuOption_First,
aba99005
RR
189 MapMode_Lometric,
190 MapMode_Twips,
191 MapMode_Points,
192 MapMode_Metric,
0f0c61d0 193
aba99005
RR
194 UserScale_StretchHoriz,
195 UserScale_ShrinkHoriz,
196 UserScale_StretchVertic,
197 UserScale_ShrinkVertic,
0f0c61d0
VZ
198 UserScale_Restore,
199
aba99005
RR
200 AxisMirror_Horiz,
201 AxisMirror_Vertic,
0f0c61d0 202
aba99005
RR
203 LogicalOrigin_MoveDown,
204 LogicalOrigin_MoveUp,
205 LogicalOrigin_MoveLeft,
206 LogicalOrigin_MoveRight,
0f0c61d0
VZ
207
208 Colour_TextForeground,
209 Colour_TextBackground,
210 Colour_Background,
211 Colour_BackgroundMode,
1edc9f45 212 Colour_TextureBackgound,
0f0c61d0 213
1edc9f45 214 MenuOption_Last = Colour_TextureBackgound
aba99005
RR
215};
216
217// ----------------------------------------------------------------------------
218// event tables and other macros for wxWindows
219// ----------------------------------------------------------------------------
220
aba99005
RR
221
222// Create a new application object: this macro will allow wxWindows to create
223// the application object during program execution (it's better than using a
224// static object for many reasons) and also declares the accessor function
225// wxGetApp() which will return the reference of the right type (i.e. MyApp and
226// not wxApp)
227IMPLEMENT_APP(MyApp)
228
229// ============================================================================
230// implementation
231// ============================================================================
232
233// ----------------------------------------------------------------------------
234// the application class
235// ----------------------------------------------------------------------------
236
568708e2
VZ
237bool MyApp::LoadImages()
238{
239 wxPathList pathList;
240 pathList.Add(".");
241 pathList.Add("..");
242
243 wxString path = pathList.FindValidPath("pat4.bmp");
244 if ( !path )
245 return FALSE;
246 gs_bmp4.LoadFile(path, wxBITMAP_TYPE_BMP);
247 wxMask* mask4 = new wxMask(gs_bmp4, *wxBLACK);
248 gs_bmp4.SetMask(mask4);
249
250 path = pathList.FindValidPath("pat36.bmp");
251 if ( !path )
252 return FALSE;
253 gs_bmp36.LoadFile(path, wxBITMAP_TYPE_BMP);
254 wxMask* mask36 = new wxMask(gs_bmp36, *wxBLACK);
255 gs_bmp36.SetMask(mask36);
256
257 path = pathList.FindValidPath("image.bmp");
258 if ( !path )
259 return FALSE;
260 gs_bmpNoMask.LoadFile(path, wxBITMAP_TYPE_BMP);
261 gs_bmpWithMask.LoadFile(path, wxBITMAP_TYPE_BMP);
262 gs_bmpWithColMask.LoadFile(path, wxBITMAP_TYPE_BMP);
263
264 path = pathList.FindValidPath("mask.bmp");
265 if ( !path )
266 return FALSE;
267 gs_bmpMask.LoadFile(path, wxBITMAP_TYPE_BMP);
b9de1315 268
ff7c6c9c
RR
269// This is so wrong, it hurts.
270// gs_bmpMask.SetDepth(1);
271// wxMask *mask = new wxMask(gs_bmpMask);
568708e2 272
ff7c6c9c 273 wxMask *mask = new wxMask(gs_bmpMask, *wxBLACK);
568708e2
VZ
274 gs_bmpWithMask.SetMask(mask);
275
276 mask = new wxMask(gs_bmpWithColMask, *wxWHITE);
277 gs_bmpWithColMask.SetMask(mask);
278
279 return TRUE;
280}
281
aba99005
RR
282// `Main program' equivalent: the program execution "starts" here
283bool MyApp::OnInit()
284{
285 // Create the main application window
ed43910d 286 MyFrame *frame = new MyFrame("Drawing sample",
b62c3631 287 wxPoint(50, 50), wxSize(550, 340));
aba99005
RR
288
289 // Show it and tell the application that it's our main window
aba99005
RR
290 frame->Show(TRUE);
291 SetTopWindow(frame);
292
568708e2
VZ
293 if ( !LoadImages() )
294 {
295 wxLogError("Can't load one of the bitmap files needed for this sample "
296 "from the current or parent directory, please copy them "
297 "there.");
298
299 // stop here
300 return FALSE;
301 }
302
303 // ok, continue
aba99005
RR
304 return TRUE;
305}
306
307// ----------------------------------------------------------------------------
b62c3631 308// MyCanvas
aba99005
RR
309// ----------------------------------------------------------------------------
310
b62c3631
RR
311// the event tables connect the wxWindows events with the functions (event
312// handlers) which process them.
313BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
314 EVT_PAINT (MyCanvas::OnPaint)
bf0c00c6 315 EVT_MOTION (MyCanvas::OnMouseMove)
b62c3631
RR
316END_EVENT_TABLE()
317
0e09f76e
RR
318#include "../image/smile.xpm"
319
b97fa7cf 320MyCanvas::MyCanvas( MyFrame *parent ) : wxScrolledWindow( parent )
b62c3631 321{
b97fa7cf 322 m_owner = parent;
568708e2 323 m_show = Show_Default;
0e09f76e
RR
324 m_smile_bmp = wxBitmap(smile_xpm);
325 m_std_icon = wxTheApp->GetStdIcon(wxICON_INFORMATION);
b97fa7cf
VZ
326}
327
328//draw a polygon and an overlapping rectangle
329//is transparent is 1, the fill pattern are made transparent
330//is transparent is 2, the fill pattern are made transparent but inversed
331//is transparent is 0 the text for and background color will be used to represent/map
332//the colors of the monochrome bitmap pixels to the fillpattern
333//
334//i miss_used the the menu items for setting so called back and fore ground color
335//just to show how the those colors do influence the fillpatterns
336//just play with those,
337//and with the code
338//variations are endless using other logical functions
339void MyCanvas::DrawTestPoly( int x, int y,wxDC &dc,int transparent )
340{
568708e2
VZ
341 wxBrush* brush4 = new wxBrush(gs_bmp4);
342 wxBrush* brush36 = new wxBrush(gs_bmp36);
b97fa7cf
VZ
343
344 wxPoint todraw[5];
345 todraw[0].x=(long)x+100;
346 todraw[0].y=(long)y+100;
347 todraw[1].x=(long)x+300;
348 todraw[1].y=(long)y+100;
349 todraw[2].x=(long)x+300;
350 todraw[2].y=(long)y+300;
351 todraw[3].x=(long)x+150;
352 todraw[3].y=(long)y+350;
353 todraw[4].x=(long)x+100;
354 todraw[4].y=(long)y+300;
355
356 wxPoint todraw2[5];
357 todraw2[0].x=100;
358 todraw2[0].y=100;
359 todraw2[1].x=300;
360 todraw2[1].y=100;
361 todraw2[2].x=300;
362 todraw2[2].y=300;
363 todraw2[3].x=150;
364 todraw2[3].y=350;
365 todraw2[4].x=100;
366 todraw2[4].y=300;
367
368 switch (transparent)
369 {
370 case 0:
371 {
372 dc.SetPen( wxPen( "black", 4, wxSOLID) );
568708e2 373 dc.SetBrush( *brush4 );
b97fa7cf 374 dc.SetTextForeground(*wxGREEN);
b97fa7cf
VZ
375 dc.SetTextBackground(m_owner->m_colourForeground);
376 dc.SetLogicalFunction(wxCOPY);
377 dc.DrawPolygon(5,todraw,0,0,wxWINDING_RULE);
378
379 //don't understand hwo but the outline is also depending on logicalfunction
380 dc.SetPen( wxPen( "red", 4, wxSOLID) );
568708e2 381 dc.SetBrush( *brush36 );
b97fa7cf 382 dc.SetTextForeground(*wxCYAN);
b97fa7cf
VZ
383 dc.SetTextBackground(m_owner->m_colourBackground);
384 dc.SetLogicalFunction(wxCOPY);
385 dc.DrawRectangle( x+10, y+10, 200, 200 );
386 dc.SetBrush(wxNullBrush);
387 dc.SetPen(wxNullPen);
388 break;
389 }
390 case 1: //now with transparent fillpatterns
391 {
392
568708e2
VZ
393 wxBitmap* bmpBlit = new wxBitmap(600,400);
394 wxMemoryDC* memDC= new wxMemoryDC();
b97fa7cf
VZ
395 // wxBrush _clearbrush(*wxGREEN,wxSOLID);
396 wxBrush _clearbrush(*wxBLACK,wxSOLID);
568708e2
VZ
397 memDC->SelectObject(*bmpBlit);
398 memDC->BeginDrawing();
399 memDC->SetBackground(_clearbrush);
400 memDC->Clear();
401 memDC->SetBackground(wxNullBrush);
402
403 memDC->SetPen( wxPen( "black", 4, wxSOLID) );
404 memDC->SetBrush( wxNullBrush);
405 memDC->SetBrush( *brush4 );
406 memDC->SetTextForeground(*wxBLACK); // 0s --> 0x000000 (black)
407 memDC->SetTextBackground(*wxWHITE); // 1s --> 0xFFFFFF (white)
408 memDC->SetLogicalFunction(wxAND_INVERT);
b97fa7cf
VZ
409
410 // BLACK OUT the opaque pixels and leave the rest as is
568708e2 411 memDC->DrawPolygon(5,todraw2,0,0,wxWINDING_RULE);
b97fa7cf
VZ
412
413 // Set background and foreground colors for fill pattern
414 //the previous blacked out pixels are now merged with the layer color
415 //while the non blacked out pixels stay as they are.
568708e2 416 memDC->SetTextForeground(*wxBLACK); // 0s --> 0x000000 (black)
b97fa7cf
VZ
417
418 //now define what will be the color of the fillpattern parts that are not transparent
568708e2
VZ
419 // memDC->SetTextBackground(*wxBLUE);
420 memDC->SetTextBackground(m_owner->m_colourForeground);
421 memDC->SetLogicalFunction(wxOR);
b97fa7cf
VZ
422
423
424 //don't understand how but the outline is also depending on logicalfunction
568708e2
VZ
425 memDC->SetPen( wxPen( "red", 4, wxSOLID) );
426 memDC->DrawPolygon(5,todraw2,0,0,wxWINDING_RULE);
b97fa7cf 427
568708e2 428 memDC->SetLogicalFunction(wxCOPY);
b97fa7cf 429
568708e2
VZ
430 memDC->SetPen( wxPen( "black", 4, wxSOLID) );
431 memDC->SetBrush( wxNullBrush);
432 memDC->SetBrush( *brush36 );
433 memDC->SetTextForeground(*wxBLACK); // 0s --> 0x000000 (black)
434 memDC->SetTextBackground(*wxWHITE); // 1s --> 0xFFFFFF (white)
435 memDC->SetLogicalFunction(wxAND_INVERT);
b97fa7cf 436
568708e2 437 memDC->DrawRectangle( 10, 10, 200, 200 );
b97fa7cf
VZ
438
439 // Set background and foreground colors for fill pattern
440 //the previous blacked out pixels are now merged with the layer color
441 //while the non blacked out pixels stay as they are.
568708e2 442 memDC->SetTextForeground(*wxBLACK); // 0s --> 0x000000 (black)
b97fa7cf 443 //now define what will be the color of the fillpattern parts that are not transparent
568708e2
VZ
444 // memDC->SetTextBackground(*wxRED);
445 memDC->SetTextBackground(m_owner->m_colourBackground);
446 memDC->SetLogicalFunction(wxOR);
b97fa7cf
VZ
447
448 //don't understand how but the outline is also depending on logicalfunction
568708e2
VZ
449 memDC->SetPen( wxPen( "yellow", 4, wxSOLID) );
450 memDC->DrawRectangle( 10, 10, 200, 200 );
b97fa7cf 451
568708e2
VZ
452 memDC->SetBrush(wxNullBrush);
453 memDC->SetPen(wxNullPen);
b97fa7cf 454
568708e2
VZ
455 memDC->EndDrawing();
456 dc.Blit(x,y,600,400,memDC,0,0,wxCOPY);
457 delete bmpBlit;
458 delete memDC;
b97fa7cf
VZ
459 break;
460 }
461 case 2: //now with transparent inversed fillpatterns
462 {
568708e2
VZ
463 wxBitmap* bmpBlit = new wxBitmap(600,400);
464 wxMemoryDC* memDC= new wxMemoryDC();
b97fa7cf 465 wxBrush _clearbrush(*wxWHITE,wxSOLID);
568708e2
VZ
466 memDC->SelectObject(*bmpBlit);
467 memDC->BeginDrawing();
468 memDC->SetBackground(_clearbrush);
469 memDC->Clear();
470 memDC->SetBackground(wxNullBrush);
471
472 memDC->SetPen( wxPen( "black", 4, wxSOLID) );
473 memDC->SetBrush( *brush4 );
474 memDC->SetTextBackground(*wxBLACK); // 0s --> 0x000000 (black)
475 memDC->SetTextForeground(*wxWHITE); // 1s --> 0xFFFFFF (white)
476 memDC->SetLogicalFunction(wxAND_INVERT);
b97fa7cf
VZ
477
478 // BLACK OUT the opaque pixels and leave the rest as is
568708e2 479 memDC->DrawPolygon(5,todraw2,0,0,wxWINDING_RULE);
b97fa7cf
VZ
480
481 // Set background and foreground colors for fill pattern
482 //the previous blacked out pixels are now merged with the layer color
483 //while the non blacked out pixels stay as they are.
568708e2 484 memDC->SetTextBackground(*wxBLACK); // 0s --> 0x000000 (black)
b97fa7cf
VZ
485
486 //now define what will be the color of the fillpattern parts that are not transparent
568708e2
VZ
487 memDC->SetTextForeground(m_owner->m_colourForeground);
488 memDC->SetLogicalFunction(wxOR);
b97fa7cf
VZ
489
490
491 //don't understand how but the outline is also depending on logicalfunction
568708e2
VZ
492 memDC->SetPen( wxPen( "red", 4, wxSOLID) );
493 memDC->DrawPolygon(5,todraw2,0,0,wxWINDING_RULE);
b97fa7cf 494
568708e2 495 memDC->SetLogicalFunction(wxCOPY);
b97fa7cf 496
568708e2
VZ
497 memDC->SetPen( wxPen( "black", 4, wxSOLID) );
498 memDC->SetBrush( *brush36 );
499 memDC->SetTextBackground(*wxBLACK); // 0s --> 0x000000 (black)
500 memDC->SetTextForeground(*wxWHITE); // 1s --> 0xFFFFFF (white)
501 memDC->SetLogicalFunction(wxAND_INVERT);
b97fa7cf 502
568708e2 503 memDC->DrawRectangle( 10,10, 200, 200 );
b97fa7cf
VZ
504
505 // Set background and foreground colors for fill pattern
506 //the previous blacked out pixels are now merged with the layer color
507 //while the non blacked out pixels stay as they are.
568708e2 508 memDC->SetTextBackground(*wxBLACK); // 0s --> 0x000000 (black)
b97fa7cf 509 //now define what will be the color of the fillpattern parts that are not transparent
568708e2
VZ
510 memDC->SetTextForeground(m_owner->m_colourBackground);
511 memDC->SetLogicalFunction(wxOR);
b97fa7cf
VZ
512
513 //don't understand how but the outline is also depending on logicalfunction
568708e2
VZ
514 memDC->SetPen( wxPen( "yellow", 4, wxSOLID) );
515 memDC->DrawRectangle( 10, 10, 200, 200 );
516
517 memDC->SetBrush(wxNullBrush);
518 memDC->SetPen(wxNullPen);
519 dc.Blit(x,y,600,400,memDC,0,0,wxCOPY);
520 delete bmpBlit;
521 delete memDC;
b97fa7cf
VZ
522 }
523 }
524
568708e2
VZ
525 delete brush4;
526 delete brush36;
b62c3631
RR
527}
528
1e7fd311 529void MyCanvas::DrawTestLines( int x, int y, int width, wxDC &dc )
b62c3631 530{
1e7fd311
RR
531 dc.SetPen( wxPen( "black", width, wxSOLID) );
532 dc.SetBrush( *wxRED_BRUSH );
9a8c7620 533 dc.DrawRectangle( x+10, y+10, 100, 190 );
4786aabd 534
1e7fd311 535 dc.SetPen( wxPen( "black", width, wxSOLID) );
696e1ea0 536 dc.DrawLine( x+20, y+20, 100, y+20 );
1e7fd311 537 dc.SetPen( wxPen( "black", width, wxDOT) );
696e1ea0 538 dc.DrawLine( x+20, y+30, 100, y+30 );
1e7fd311 539 dc.SetPen( wxPen( "black", width, wxSHORT_DASH) );
696e1ea0 540 dc.DrawLine( x+20, y+40, 100, y+40 );
1e7fd311 541 dc.SetPen( wxPen( "black", width, wxLONG_DASH) );
696e1ea0 542 dc.DrawLine( x+20, y+50, 100, y+50 );
1e7fd311 543 dc.SetPen( wxPen( "black", width, wxDOT_DASH) );
696e1ea0 544 dc.DrawLine( x+20, y+60, 100, y+60 );
1e7fd311
RR
545
546 dc.SetPen( wxPen( "black", width, wxBDIAGONAL_HATCH) );
696e1ea0 547 dc.DrawLine( x+20, y+70, 100, y+70 );
1e7fd311 548 dc.SetPen( wxPen( "black", width, wxCROSSDIAG_HATCH) );
696e1ea0 549 dc.DrawLine( x+20, y+80, 100, y+80 );
1e7fd311 550 dc.SetPen( wxPen( "black", width, wxFDIAGONAL_HATCH) );
696e1ea0 551 dc.DrawLine( x+20, y+90, 100, y+90 );
1e7fd311 552 dc.SetPen( wxPen( "black", width, wxCROSS_HATCH) );
696e1ea0 553 dc.DrawLine( x+20, y+100, 100, y+100 );
1e7fd311 554 dc.SetPen( wxPen( "black", width, wxHORIZONTAL_HATCH) );
696e1ea0 555 dc.DrawLine( x+20, y+110, 100, y+110 );
1e7fd311 556 dc.SetPen( wxPen( "black", width, wxVERTICAL_HATCH) );
696e1ea0 557 dc.DrawLine( x+20, y+120, 100, y+120 );
1e7fd311
RR
558
559 wxPen ud( "black", width, wxUSER_DASH );
560 wxDash dash1[1];
561 dash1[0] = 0;
562 ud.SetDashes( 1, dash1 );
696e1ea0 563 dc.DrawLine( x+20, y+140, 100, y+140 );
1e7fd311
RR
564 dash1[0] = 1;
565 ud.SetDashes( 1, dash1 );
696e1ea0 566 dc.DrawLine( x+20, y+150, 100, y+150 );
1e7fd311
RR
567 dash1[0] = 2;
568 ud.SetDashes( 1, dash1 );
696e1ea0 569 dc.DrawLine( x+20, y+160, 100, y+160 );
1e7fd311
RR
570 dash1[0] = 0xFF;
571 ud.SetDashes( 1, dash1 );
696e1ea0 572 dc.DrawLine( x+20, y+170, 100, y+170 );
b62c3631
RR
573}
574
568708e2 575void MyCanvas::DrawDefault(wxDC& dc)
b62c3631 576{
b62c3631
RR
577 // mark the origin
578 dc.DrawCircle(0, 0, 10);
70bdacfc
MB
579#if !(defined __WXGTK__) && !(defined __WXMOTIF__)
580 // not implemented in wxGTK or wxMOTIF :-(
b62c3631 581 dc.FloodFill(0, 0, wxColour(255, 0, 0));
70bdacfc 582#endif //
b62c3631 583
cd9da200
VZ
584 dc.DrawCheckMark(5, 80, 15, 15);
585 dc.DrawCheckMark(25, 80, 30, 30);
586 dc.DrawCheckMark(60, 80, 60, 60);
587
0e09f76e 588 // this is the test for "blitting bitmap into DC damages selected brush" bug
0e09f76e 589 wxCoord rectSize = m_std_icon.GetWidth() + 10;
cd9da200 590 wxCoord x = 100;
11f26ea0
VZ
591 dc.SetPen(*wxTRANSPARENT_PEN);
592 dc.SetBrush( *wxGREEN_BRUSH );
cd9da200 593 dc.DrawRectangle(x, 10, rectSize, rectSize);
0e09f76e 594 dc.DrawBitmap(m_std_icon, x + 5, 15, TRUE);
cd9da200
VZ
595 x += rectSize + 10;
596 dc.DrawRectangle(x, 10, rectSize, rectSize);
0e09f76e 597 dc.DrawIcon(m_std_icon, x + 5, 15);
cd9da200
VZ
598 x += rectSize + 10;
599 dc.DrawRectangle(x, 10, rectSize, rectSize);
11f26ea0
VZ
600
601 // test for "transparent" bitmap drawing (it intersects with the last
602 // rectangle above)
603 //dc.SetBrush( *wxTRANSPARENT_BRUSH );
d6f0a4b3 604
0e09f76e
RR
605 if (m_smile_bmp.Ok())
606 dc.DrawBitmap(m_smile_bmp, x + rectSize - 20, rectSize - 10, TRUE);
107a1787 607
ff7c6c9c 608 dc.SetBrush( *wxBLACK_BRUSH );
107a1787
RR
609 dc.DrawRectangle( 0, 160, 1000, 300 );
610
611 // draw lines
612 wxBitmap bitmap(20,70);
613 wxMemoryDC memdc;
614 memdc.SelectObject( bitmap );
615 memdc.SetBrush( *wxBLACK_BRUSH );
616 memdc.SetPen( *wxWHITE_PEN );
617 memdc.DrawRectangle(0,0,20,70);
618 memdc.DrawLine( 10,0,10,70 );
81278df2 619
d4aa3a4b 620 // to the right
4c45f240 621 wxPen pen = *wxRED_PEN;
4c45f240 622 memdc.SetPen(pen);
107a1787
RR
623 memdc.DrawLine( 10, 5,10, 5 );
624 memdc.DrawLine( 10,10,11,10 );
625 memdc.DrawLine( 10,15,12,15 );
626 memdc.DrawLine( 10,20,13,20 );
81278df2 627
d4aa3a4b
RR
628/*
629 memdc.SetPen(*wxRED_PEN);
107a1787
RR
630 memdc.DrawLine( 12, 5,12, 5 );
631 memdc.DrawLine( 12,10,13,10 );
632 memdc.DrawLine( 12,15,14,15 );
633 memdc.DrawLine( 12,20,15,20 );
d4aa3a4b 634*/
81278df2 635
107a1787
RR
636 // same to the left
637 memdc.DrawLine( 10,25,10,25 );
638 memdc.DrawLine( 10,30, 9,30 );
639 memdc.DrawLine( 10,35, 8,35 );
640 memdc.DrawLine( 10,40, 7,40 );
641
642 // XOR draw lines
d4aa3a4b 643 dc.SetPen(*wxWHITE_PEN);
107a1787
RR
644 memdc.SetLogicalFunction( wxINVERT );
645 memdc.SetPen( *wxWHITE_PEN );
646 memdc.DrawLine( 10,50,10,50 );
647 memdc.DrawLine( 10,55,11,55 );
648 memdc.DrawLine( 10,60,12,60 );
649 memdc.DrawLine( 10,65,13,65 );
81278df2 650
107a1787
RR
651 memdc.DrawLine( 12,50,12,50 );
652 memdc.DrawLine( 12,55,13,55 );
653 memdc.DrawLine( 12,60,14,60 );
654 memdc.DrawLine( 12,65,15,65 );
81278df2 655
107a1787
RR
656 memdc.SelectObject( wxNullBitmap );
657 dc.DrawBitmap( bitmap, 10, 170 );
658 wxImage image( bitmap );
659 image.Rescale( 60,210 );
660 bitmap = image.ConvertToBitmap();
661 dc.DrawBitmap( bitmap, 50, 170 );
81278df2 662
b9de1315 663 // test the rectangle outline drawing - there should be one pixel between
ff7c6c9c
RR
664 // the rect and the lines
665 dc.SetPen(*wxWHITE_PEN);
666 dc.SetBrush( *wxTRANSPARENT_BRUSH );
ff7c6c9c 667 dc.DrawRectangle(150, 170, 49, 29);
107a1787 668 dc.DrawRectangle(200, 170, 49, 29);
ff7c6c9c 669 dc.SetPen(*wxWHITE_PEN);
107a1787
RR
670 dc.DrawLine(250, 210, 250, 170);
671 dc.DrawLine(260, 200, 150, 200);
b9de1315
VZ
672
673 // test the rectangle filled drawing - there should be one pixel between
ff7c6c9c
RR
674 // the rect and the lines
675 dc.SetPen(*wxTRANSPARENT_PEN);
676 dc.SetBrush( *wxWHITE_BRUSH );
677 dc.DrawRectangle(300, 170, 49, 29);
568708e2 678 dc.DrawRectangle(350, 170, 49, 29);
ff7c6c9c 679 dc.SetPen(*wxWHITE_PEN);
b9de1315
VZ
680 dc.DrawLine(400, 170, 400, 210);
681 dc.DrawLine(300, 200, 410, 200);
682
3d2d8da1
RR
683 // a few more tests of this kind
684 dc.SetPen(*wxRED_PEN);
685 dc.SetBrush( *wxWHITE_BRUSH );
686 dc.DrawRectangle(300, 220, 1, 1);
687 dc.DrawRectangle(310, 220, 2, 2);
688 dc.DrawRectangle(320, 220, 3, 3);
689 dc.DrawRectangle(330, 220, 4, 4);
690
691 dc.SetPen(*wxTRANSPARENT_PEN);
692 dc.SetBrush( *wxWHITE_BRUSH );
693 dc.DrawRectangle(300, 230, 1, 1);
694 dc.DrawRectangle(310, 230, 2, 2);
695 dc.DrawRectangle(320, 230, 3, 3);
696 dc.DrawRectangle(330, 230, 4, 4);
697
b9de1315
VZ
698 // and now for filled rect with outline
699 dc.SetPen(*wxRED_PEN);
700 dc.SetBrush( *wxWHITE_BRUSH );
701 dc.DrawRectangle(500, 170, 49, 29);
702 dc.DrawRectangle(550, 170, 49, 29);
703 dc.SetPen(*wxWHITE_PEN);
704 dc.DrawLine(600, 170, 600, 210);
705 dc.DrawLine(500, 200, 610, 200);
706
707 // test the rectangle outline drawing - there should be one pixel between
ff7c6c9c
RR
708 // the rect and the lines
709 dc.SetPen(*wxWHITE_PEN);
710 dc.SetBrush( *wxTRANSPARENT_BRUSH );
ff7c6c9c 711 dc.DrawRoundedRectangle(150, 270, 49, 29, 6);
107a1787 712 dc.DrawRoundedRectangle(200, 270, 49, 29, 6);
ff7c6c9c 713 dc.SetPen(*wxWHITE_PEN);
107a1787
RR
714 dc.DrawLine(250, 270, 250, 310);
715 dc.DrawLine(150, 300, 260, 300);
b9de1315
VZ
716
717 // test the rectangle filled drawing - there should be one pixel between
ff7c6c9c
RR
718 // the rect and the lines
719 dc.SetPen(*wxTRANSPARENT_PEN);
720 dc.SetBrush( *wxWHITE_BRUSH );
721 dc.DrawRoundedRectangle(300, 270, 49, 29, 6);
722 dc.DrawRoundedRectangle(350, 270, 49, 29, 6);
723 dc.SetPen(*wxWHITE_PEN);
b9de1315
VZ
724 dc.DrawLine(400, 270, 400, 310);
725 dc.DrawLine(300, 300, 410, 300);
ff7c6c9c 726
b14c14ff
JS
727 // Added by JACS to demonstrate bizarre behaviour.
728 // With a size of 70, we get a missing red RHS,
729 // and the hight is too small, so we get yellow
730 // showing. With a size of 40, it draws as expected:
731 // it just shows a white rectangle with red outline.
732 int totalWidth = 70;
733 int totalHeight = 70;
734 wxBitmap bitmap2(totalWidth, totalHeight);
735
736 wxMemoryDC memdc2;
737 memdc2.SelectObject(bitmap2);
738
d6f0a4b3
JS
739 wxBrush yellowBrush(wxColour(255, 255, 0), wxSOLID);
740 memdc2.SetBackground(yellowBrush);
741 memdc2.Clear();
b14c14ff 742
d6f0a4b3 743 wxPen yellowPen(wxColour(255, 255, 0), 1, wxSOLID);
b14c14ff
JS
744
745 // Now draw a white rectangle with red outline. It should
746 // entirely eclipse the yellow background.
747 memdc2.SetPen(*wxRED_PEN);
748 memdc2.SetBrush(*wxWHITE_BRUSH);
749
750 memdc2.DrawRectangle(0, 0, totalWidth, totalHeight);
751
b14c14ff
JS
752 memdc2.SetPen(wxNullPen);
753 memdc2.SetBrush(wxNullBrush);
cd9da200 754 memdc2.SelectObject(wxNullBitmap);
b14c14ff
JS
755
756 dc.DrawBitmap(bitmap2, 500, 270);
d6f0a4b3
JS
757
758 // Repeat, but draw directly on dc
759 // Draw a yellow rectangle filling the bitmap
760
761 x = 600; int y = 270;
762 dc.SetPen(yellowPen);
763 dc.SetBrush(yellowBrush);
764 dc.DrawRectangle(x, y, totalWidth, totalHeight);
765
766 // Now draw a white rectangle with red outline. It should
767 // entirely eclipse the yellow background.
768 dc.SetPen(*wxRED_PEN);
769 dc.SetBrush(*wxWHITE_BRUSH);
770
771 dc.DrawRectangle(x, y, totalWidth, totalHeight);
568708e2
VZ
772}
773
774void MyCanvas::DrawText(wxDC& dc)
775{
9a8c7620
VZ
776 // set underlined font for testing
777 dc.SetFont( wxFont(12, wxMODERN, wxNORMAL, wxNORMAL, TRUE) );
b62c3631 778 dc.DrawText( "This is text", 110, 10 );
4786aabd 779 dc.DrawRotatedText( "That is text", 20, 10, -45 );
9a8c7620
VZ
780
781 dc.SetFont( *wxNORMAL_FONT );
b62c3631 782
696e1ea0 783 wxString text;
9a8c7620 784 dc. SetBackgroundMode(wxTRANSPARENT);
696e1ea0
VZ
785
786 for ( int n = -180; n < 180; n += 30 )
787 {
788 text.Printf(" %d rotated text", n);
789 dc.DrawRotatedText(text , 400, 400, n);
790 }
95724b1a 791
196c87f4 792 dc.SetFont( wxFont( 18, wxSWISS, wxNORMAL, wxNORMAL ) );
c45a644e
RR
793
794 dc.DrawText( "This is Swiss 18pt text.", 110, 40 );
795
796 long length;
797 long height;
798 long descent;
799 dc.GetTextExtent( "This is Swiss 18pt text.", &length, &height, &descent );
c45a644e
RR
800 text.Printf( "Dimensions are length %ld, height %ld, descent %ld", length, height, descent );
801 dc.DrawText( text, 110, 80 );
802
c45a644e
RR
803 text.Printf( "CharHeight() returns: %d", dc.GetCharHeight() );
804 dc.DrawText( text, 110, 120 );
805
568708e2
VZ
806 dc.DrawRectangle( 100, 40, 4, height );
807}
808
81278df2 809static const struct
568708e2 810{
81278df2
VZ
811 const wxChar *name;
812 int rop;
813} rasterOperations[] =
814{
815 { "wxAND", wxAND },
816 { "wxAND_INVERT", wxAND_INVERT },
817 { "wxAND_REVERSE", wxAND_REVERSE },
818 { "wxCLEAR", wxCLEAR },
819 { "wxCOPY", wxCOPY },
820 { "wxEQUIV", wxEQUIV },
821 { "wxINVERT", wxINVERT },
822 { "wxNAND", wxNAND },
823 { "wxNO_OP", wxNO_OP },
824 { "wxOR", wxOR },
825 { "wxOR_INVERT", wxOR_INVERT },
826 { "wxOR_REVERSE", wxOR_REVERSE },
827 { "wxSET", wxSET },
828 { "wxSRC_INVERT", wxSRC_INVERT },
829 { "wxXOR", wxXOR },
830};
568708e2 831
81278df2
VZ
832void MyCanvas::DrawImages(wxDC& dc)
833{
568708e2
VZ
834 dc.DrawText("original image", 0, 0);
835 dc.DrawBitmap(gs_bmpNoMask, 0, 20, 0);
836 dc.DrawText("with colour mask", 0, 100);
837 dc.DrawBitmap(gs_bmpWithColMask, 0, 120, TRUE);
838 dc.DrawText("the mask image", 0, 200);
839 dc.DrawBitmap(gs_bmpMask, 0, 220, 0);
840 dc.DrawText("masked image", 0, 300);
841 dc.DrawBitmap(gs_bmpWithMask, 0, 320, TRUE);
842
843 int cx = gs_bmpWithColMask.GetWidth(),
844 cy = gs_bmpWithColMask.GetHeight();
845
846 wxMemoryDC memDC;
847 for ( size_t n = 0; n < WXSIZEOF(rasterOperations); n++ )
848 {
849 wxCoord x = 120 + 150*(n%4),
850 y = 20 + 100*(n/4);
4786aabd 851
568708e2
VZ
852 dc.DrawText(rasterOperations[n].name, x, y - 20);
853 memDC.SelectObject(gs_bmpWithColMask);
854 dc.Blit(x, y, cx, cy, &memDC, 0, 0, rasterOperations[n].rop, TRUE);
855 }
856}
857
81278df2
VZ
858void MyCanvas::DrawWithLogicalOps(wxDC& dc)
859{
860 static const wxCoord w = 60;
861 static const wxCoord h = 60;
862
863 // reuse the text colour here
864 dc.SetPen(wxPen(m_owner->m_colourForeground, 1, wxSOLID));
11f26ea0 865 dc.SetBrush(*wxTRANSPARENT_BRUSH);
81278df2 866
5888ef1e
VZ
867 size_t n;
868 for ( n = 0; n < WXSIZEOF(rasterOperations); n++ )
81278df2
VZ
869 {
870 wxCoord x = 20 + 150*(n%4),
871 y = 20 + 100*(n/4);
872
873 dc.DrawText(rasterOperations[n].name, x, y - 20);
874 dc.SetLogicalFunction(rasterOperations[n].rop);
11f26ea0 875 dc.DrawRectangle(x, y, w, h);
81278df2
VZ
876 dc.DrawLine(x, y, x + w, y + h);
877 dc.DrawLine(x + w, y, x, y + h);
878 }
c1d139da
GRG
879
880 // now some filled rectangles
881 dc.SetBrush(wxBrush(m_owner->m_colourForeground, wxSOLID));
882
5888ef1e 883 for ( n = 0; n < WXSIZEOF(rasterOperations); n++ )
c1d139da
GRG
884 {
885 wxCoord x = 20 + 150*(n%4),
886 y = 500 + 100*(n/4);
887
888 dc.DrawText(rasterOperations[n].name, x, y - 20);
889 dc.SetLogicalFunction(rasterOperations[n].rop);
890 dc.DrawRectangle(x, y, w, h);
891 }
81278df2
VZ
892}
893
bc3cedfa
RR
894void MyCanvas::DrawRegions(wxDC& dc)
895{
896 dc.SetBrush( *wxWHITE_BRUSH );
897 dc.SetPen( *wxTRANSPARENT_PEN );
898 dc.DrawRectangle( 10,10,310,310 );
899
900 wxRegion region( 20,20,100,270 );
901 dc.SetClippingRegion( region );
902
903 dc.SetBrush( *wxRED_BRUSH );
904 dc.DrawRectangle( 10,10,310,310 );
905
906 region = wxRegion( 120,30,100,270 );
907 dc.SetClippingRegion( region );
908
909 dc.SetBrush( *wxGREY_BRUSH );
910 dc.DrawRectangle( 10,10,310,310 );
5d25c050
RR
911
912 if (m_smile_bmp.Ok())
913 {
914 dc.DrawBitmap( m_smile_bmp, 140, 20, TRUE );
915 dc.DrawBitmap( m_smile_bmp, 140, 290, TRUE );
916 dc.DrawBitmap( m_smile_bmp, 110, 80, TRUE );
917 dc.DrawBitmap( m_smile_bmp, 210, 80, TRUE );
918 }
bc3cedfa
RR
919}
920
568708e2
VZ
921void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event))
922{
923 wxPaintDC dc(this);
924 PrepareDC(dc);
925 m_owner->PrepareDC(dc);
926
927 dc.SetBackgroundMode( m_owner->m_backgroundMode );
928 if ( m_owner->m_backgroundBrush.Ok() )
929 dc.SetBackground( m_owner->m_backgroundBrush );
930 if ( m_owner->m_colourForeground.Ok() )
931 dc.SetTextForeground( m_owner->m_colourForeground );
932 if ( m_owner->m_colourBackground.Ok() )
933 dc.SetTextBackground( m_owner->m_colourBackground );
4786aabd 934
1edc9f45 935 if ( m_owner->m_textureBackground) {
047473c9 936 if ( ! m_owner->m_backgroundBrush.Ok() ) {
1edc9f45
RD
937 wxBrush b(wxColour(0,128,0), wxSOLID);
938 dc.SetBackground(b);
939 }
047473c9
RD
940 }
941
bc3cedfa 942// dc.Clear();
1edc9f45 943
047473c9 944 if ( m_owner->m_textureBackground) {
1edc9f45
RD
945 dc.SetPen(*wxMEDIUM_GREY_PEN);
946 for (int i=0; i<200; i++)
947 dc.DrawLine(0, i*10, i*10, 0);
948 }
949
568708e2
VZ
950 switch ( m_show )
951 {
952 case Show_Default:
953 DrawDefault(dc);
954 break;
1e7fd311 955
bc3cedfa
RR
956 case Show_Regions:
957 DrawRegions(dc);
958 break;
959
568708e2
VZ
960 case Show_Text:
961 DrawText(dc);
962 break;
1e7fd311 963
568708e2
VZ
964 case Show_Lines:
965 DrawTestLines( 0, 100, 0, dc );
966 DrawTestLines( 0, 300, 1, dc );
967 DrawTestLines( 0, 500, 2, dc );
968 DrawTestLines( 0, 700, 6, dc );
969 break;
1e7fd311 970
568708e2
VZ
971 case Show_Polygons:
972 DrawTestPoly( 0, 100, dc, 0 );
973 DrawTestPoly( 33, 500, dc, 1 );
974 DrawTestPoly( 43, 1000, dc, 2 );
975 break;
1e7fd311 976
568708e2
VZ
977 case Show_Mask:
978 DrawImages(dc);
979 break;
81278df2
VZ
980
981 case Show_Ops:
982 DrawWithLogicalOps(dc);
983 break;
568708e2 984 }
b62c3631
RR
985}
986
bf0c00c6
RR
987void MyCanvas::OnMouseMove(wxMouseEvent &event)
988{
989 wxClientDC dc(this);
990 PrepareDC(dc);
991 m_owner->PrepareDC(dc);
992
993 wxPoint pos = event.GetPosition();
994 long x = dc.DeviceToLogicalX( pos.x );
995 long y = dc.DeviceToLogicalY( pos.y );
996 wxString str;
997 str.Printf( "Current mouse position: %d,%d", (int)x, (int)y );
998 m_owner->SetStatusText( str );
999}
1000
b62c3631
RR
1001// ----------------------------------------------------------------------------
1002// MyFrame
1003// ----------------------------------------------------------------------------
1004
1005// the event tables connect the wxWindows events with the functions (event
1006// handlers) which process them. It can be also done at run-time, but for the
1007// simple menu events like this the static method is much simpler.
1008BEGIN_EVENT_TABLE(MyFrame, wxFrame)
568708e2
VZ
1009 EVT_MENU (File_Quit, MyFrame::OnQuit)
1010 EVT_MENU (File_About, MyFrame::OnAbout)
1011
1012 EVT_MENU_RANGE(MenuShow_First, MenuShow_Last, MyFrame::OnShow)
1013
b62c3631
RR
1014 EVT_MENU_RANGE(MenuOption_First, MenuOption_Last, MyFrame::OnOption)
1015END_EVENT_TABLE()
1016
aba99005
RR
1017// frame constructor
1018MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
1019 : wxFrame((wxFrame *)NULL, -1, title, pos, size)
1020{
1021 // set the frame icon
1022 SetIcon(wxICON(mondrian));
1023
1024 wxMenu *menuFile = new wxMenu;
568708e2
VZ
1025 menuFile->Append(File_ShowDefault, "&Default screen\tF1");
1026 menuFile->Append(File_ShowText, "&Text screen\tF2");
1027 menuFile->Append(File_ShowLines, "&Lines screen\tF3");
1028 menuFile->Append(File_ShowPolygons, "&Polygons screen\tF4");
1029 menuFile->Append(File_ShowMask, "wx&Mask screen\tF5");
81278df2 1030 menuFile->Append(File_ShowOps, "&ROP screen\tF6");
bc3cedfa 1031 menuFile->Append(File_ShowRegions, "Re&gions screen\tF6");
568708e2
VZ
1032 menuFile->AppendSeparator();
1033 menuFile->Append(File_About, "&About...\tCtrl-A", "Show about dialog");
aba99005 1034 menuFile->AppendSeparator();
568708e2 1035 menuFile->Append(File_Quit, "E&xit\tAlt-X", "Quit this program");
0f0c61d0 1036
aba99005
RR
1037 wxMenu *menuMapMode = new wxMenu;
1038 menuMapMode->Append( MapMode_Text, "&TEXT map mode" );
1039 menuMapMode->Append( MapMode_Lometric, "&LOMETRIC map mode" );
1040 menuMapMode->Append( MapMode_Twips, "T&WIPS map mode" );
1041 menuMapMode->Append( MapMode_Points, "&POINTS map mode" );
1042 menuMapMode->Append( MapMode_Metric, "&METRIC map mode" );
0f0c61d0 1043
aba99005 1044 wxMenu *menuUserScale = new wxMenu;
ed43910d
RR
1045 menuUserScale->Append( UserScale_StretchHoriz, "Stretch horizontally\tCtrl-H" );
1046 menuUserScale->Append( UserScale_ShrinkHoriz, "Shrink horizontally\tCtrl-G" );
1047 menuUserScale->Append( UserScale_StretchVertic, "Stretch vertically\tCtrl-V" );
1048 menuUserScale->Append( UserScale_ShrinkVertic, "Shrink vertically\tCtrl-W" );
0f0c61d0
VZ
1049 menuUserScale->AppendSeparator();
1050 menuUserScale->Append( UserScale_Restore, "Restore to normal\tCtrl-0" );
1051
aba99005 1052 wxMenu *menuAxis = new wxMenu;
220af862
VZ
1053 menuAxis->Append( AxisMirror_Horiz, "Mirror horizontally\tCtrl-M", "", TRUE );
1054 menuAxis->Append( AxisMirror_Vertic, "Mirror vertically\tCtrl-N", "", TRUE );
0f0c61d0 1055
aba99005
RR
1056 wxMenu *menuLogical = new wxMenu;
1057 menuLogical->Append( LogicalOrigin_MoveDown, "Move &down\tCtrl-D" );
1058 menuLogical->Append( LogicalOrigin_MoveUp, "Move &up\tCtrl-U" );
1059 menuLogical->Append( LogicalOrigin_MoveLeft, "Move &right\tCtrl-L" );
1060 menuLogical->Append( LogicalOrigin_MoveRight, "Move &left\tCtrl-R" );
1061
0f0c61d0
VZ
1062 wxMenu *menuColour = new wxMenu;
1063 menuColour->Append( Colour_TextForeground, "Text foreground..." );
1064 menuColour->Append( Colour_TextBackground, "Text background..." );
1065 menuColour->Append( Colour_Background, "Background colour..." );
1066 menuColour->Append( Colour_BackgroundMode, "Opaque/transparent\tCtrl-B", "", TRUE );
1edc9f45 1067 menuColour->Append( Colour_TextureBackgound, "Draw textured background\tCtrl-T", "", TRUE);
0f0c61d0 1068
aba99005
RR
1069 // now append the freshly created menu to the menu bar...
1070 wxMenuBar *menuBar = new wxMenuBar;
1071 menuBar->Append(menuFile, "&File");
1072 menuBar->Append(menuMapMode, "&MapMode");
1073 menuBar->Append(menuUserScale, "&UserScale");
1074 menuBar->Append(menuAxis, "&Axis");
1075 menuBar->Append(menuLogical, "&LogicalOrigin");
0f0c61d0 1076 menuBar->Append(menuColour, "&Colours");
aba99005
RR
1077
1078 // ... and attach this menu bar to the frame
1079 SetMenuBar(menuBar);
1080
1081 // create a status bar just for fun (by default with 1 pane only)
1082 CreateStatusBar(2);
1083 SetStatusText("Welcome to wxWindows!");
0f0c61d0 1084
aba99005
RR
1085 m_mapMode = wxMM_TEXT;
1086 m_xUserScale = 1.0;
1087 m_yUserScale = 1.0;
1088 m_xLogicalOrigin = 0;
1089 m_yLogicalOrigin = 0;
0f0c61d0
VZ
1090 m_xAxisReversed =
1091 m_yAxisReversed = FALSE;
1092 m_backgroundMode = wxSOLID;
b97fa7cf
VZ
1093 m_colourForeground = *wxRED;
1094 m_colourBackground = *wxBLUE;
1edc9f45 1095 m_textureBackground = FALSE;
aba99005 1096
b62c3631 1097 m_canvas = new MyCanvas( this );
b97fa7cf 1098 m_canvas->SetScrollbars( 10, 10, 100, 240 );
b62c3631 1099}
aba99005
RR
1100
1101// event handlers
1102
1103void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
1104{
1105 // TRUE is to force the frame to close
1106 Close(TRUE);
1107}
1108
1109void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
1110{
1111 wxString msg;
c916e13b
RR
1112 msg.Printf( wxT("This is the about dialog of the drawing sample.\n")
1113 wxT("This sample tests various primitive drawing functions\n")
1114 wxT("without any tests to prevent flicker.\n")
1115 wxT("Copyright (c) Robert Roebling 1999")
aba99005
RR
1116 );
1117
1118 wxMessageBox(msg, "About Drawing", wxOK | wxICON_INFORMATION, this);
1119}
1120
568708e2
VZ
1121void MyFrame::OnShow(wxCommandEvent& event)
1122{
1123 m_canvas->Show((ScreenToShow)(event.GetInt() - MenuShow_First));
1124}
1125
1126void MyFrame::OnOption(wxCommandEvent& event)
aba99005
RR
1127{
1128 switch (event.GetInt())
1129 {
1130 case MapMode_Text:
b9857632 1131 m_mapMode = wxMM_TEXT;
0f0c61d0 1132 break;
aba99005
RR
1133 case MapMode_Lometric:
1134 m_mapMode = wxMM_LOMETRIC;
0f0c61d0
VZ
1135 break;
1136 case MapMode_Twips:
aba99005 1137 m_mapMode = wxMM_TWIPS;
0f0c61d0
VZ
1138 break;
1139 case MapMode_Points:
aba99005 1140 m_mapMode = wxMM_POINTS;
0f0c61d0
VZ
1141 break;
1142 case MapMode_Metric:
aba99005 1143 m_mapMode = wxMM_METRIC;
0f0c61d0
VZ
1144 break;
1145
1146 case LogicalOrigin_MoveDown:
1147 m_yLogicalOrigin += 10;
1148 break;
1149 case LogicalOrigin_MoveUp:
1150 m_yLogicalOrigin -= 10;
1151 break;
1152 case LogicalOrigin_MoveLeft:
1153 m_xLogicalOrigin += 10;
1154 break;
1155 case LogicalOrigin_MoveRight:
1156 m_xLogicalOrigin -= 10;
1157 break;
1158
1159 case UserScale_StretchHoriz:
1160 m_xUserScale *= 1.10;
1161 break;
1162 case UserScale_ShrinkHoriz:
1163 m_xUserScale /= 1.10;
1164 break;
1165 case UserScale_StretchVertic:
1166 m_yUserScale *= 1.10;
1167 break;
1168 case UserScale_ShrinkVertic:
1169 m_yUserScale /= 1.10;
1170 break;
1171 case UserScale_Restore:
1172 m_xUserScale =
1173 m_yUserScale = 1.0;
1174 break;
1175
1176 case AxisMirror_Vertic:
1177 m_yAxisReversed = !m_yAxisReversed;
1178 break;
1179 case AxisMirror_Horiz:
1180 m_xAxisReversed = !m_xAxisReversed;
1181 break;
1182
1183 case Colour_TextForeground:
1184 m_colourForeground = SelectColour();
1185 break;
1186 case Colour_TextBackground:
1187 m_colourBackground = SelectColour();
1188 break;
1189 case Colour_Background:
1190 {
1191 wxColour col = SelectColour();
1192 if ( col.Ok() )
1193 {
1194 m_backgroundBrush.SetColour(col);
1195 }
1196 }
1197 break;
1198 case Colour_BackgroundMode:
1199 m_backgroundMode = m_backgroundMode == wxSOLID ? wxTRANSPARENT
1200 : wxSOLID;
1201 break;
1202
1edc9f45
RD
1203 case Colour_TextureBackgound:
1204 m_textureBackground = ! m_textureBackground;
1205 break;
1206
0f0c61d0
VZ
1207 default:
1208 // skip Refresh()
1209 return;
aba99005 1210 }
0f0c61d0 1211
1e7fd311 1212 m_canvas->Refresh();
aba99005
RR
1213}
1214
220af862 1215void MyFrame::PrepareDC(wxDC& dc)
aba99005 1216{
0f0c61d0
VZ
1217 dc.SetMapMode( m_mapMode );
1218 dc.SetUserScale( m_xUserScale, m_yUserScale );
1219 dc.SetLogicalOrigin( m_xLogicalOrigin, m_yLogicalOrigin );
428db2ea 1220 dc.SetAxisOrientation( !m_xAxisReversed, m_yAxisReversed );
220af862
VZ
1221}
1222
220af862 1223wxColour MyFrame::SelectColour()
0f0c61d0
VZ
1224{
1225 wxColour col;
1226 wxColourData data;
1227 wxColourDialog dialog(this, &data);
1228
1229 if ( dialog.ShowModal() == wxID_OK )
1230 {
428db2ea 1231 col = dialog.GetColourData().GetColour();
0f0c61d0
VZ
1232 }
1233
1234 return col;
aba99005 1235}