home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / samples / sashtest / sashtest.cpp < prev    next >
C/C++ Source or Header  |  2002-12-16  |  11KB  |  369 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        sashtest.cpp
  3. // Purpose:     Layout/sash sample
  4. // Author:      Julian Smart
  5. // Modified by:
  6. // Created:     04/01/98
  7. // RCS-ID:      $Id: sashtest.cpp,v 1.11.2.1 2002/12/15 17:25:33 MBN Exp $
  8. // Copyright:   (c) Julian Smart and Markus Holzem
  9. // Licence:     wxWindows license
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. // For compilers that support precompilation, includes "wx/wx.h".
  13. #include "wx/wxprec.h"
  14.  
  15. #ifdef __BORLANDC__
  16. #pragma hdrstop
  17. #endif
  18.  
  19. #ifndef WX_PRECOMP
  20. #include "wx/wx.h"
  21. #include "wx/mdi.h"
  22. #endif
  23.  
  24. #include "wx/toolbar.h"
  25. #include "wx/laywin.h"
  26.  
  27. #include "sashtest.h"
  28.  
  29. MyFrame *frame = NULL;
  30. wxList my_children;
  31.  
  32. IMPLEMENT_APP(MyApp)
  33.  
  34. // For drawing lines in a canvas
  35. long xpos = -1;
  36. long ypos = -1;
  37.  
  38. int winNumber = 1;
  39.  
  40. // Initialise this in OnInit, not statically
  41. bool MyApp::OnInit(void)
  42. {
  43.   // Create the main frame window
  44.  
  45.   frame = new MyFrame(NULL, -1, _T("Sash Demo"), wxPoint(0, 0), wxSize(500, 400),
  46.                       wxDEFAULT_FRAME_STYLE |
  47.                       wxNO_FULL_REPAINT_ON_RESIZE |
  48.                       wxHSCROLL | wxVSCROLL);
  49.  
  50.   // Give it an icon (this is ignored in MDI mode: uses resources)
  51. #ifdef __WXMSW__
  52.   frame->SetIcon(wxIcon(_T("sashtest_icn")));
  53. #endif
  54. #ifdef __X__
  55.   frame->SetIcon(wxIcon(_T("sashtest.xbm")));
  56. #endif
  57.  
  58.   // Make a menubar
  59.   wxMenu *file_menu = new wxMenu;
  60.  
  61.   file_menu->Append(SASHTEST_NEW_WINDOW, _T("&New window"));
  62.   file_menu->Append(SASHTEST_TOGGLE_WINDOW, _T("&Toggle window"));
  63.   file_menu->Append(SASHTEST_QUIT, _T("&Exit"));
  64.  
  65.   wxMenu *help_menu = new wxMenu;
  66.   help_menu->Append(SASHTEST_ABOUT, _T("&About"));
  67.  
  68.   wxMenuBar *menu_bar = new wxMenuBar;
  69.  
  70.   menu_bar->Append(file_menu, _T("&File"));
  71.   menu_bar->Append(help_menu, _T("&Help"));
  72.  
  73.   // Associate the menu bar with the frame
  74.   frame->SetMenuBar(menu_bar);
  75.  
  76.   frame->CreateStatusBar();
  77.  
  78.   frame->Show(TRUE);
  79.  
  80.   SetTopWindow(frame);
  81.  
  82.   return TRUE;
  83. }
  84.  
  85. BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame)
  86.     EVT_MENU(SASHTEST_ABOUT, MyFrame::OnAbout)
  87.     EVT_MENU(SASHTEST_NEW_WINDOW, MyFrame::OnNewWindow)
  88.     EVT_SIZE(MyFrame::OnSize)
  89.     EVT_MENU(SASHTEST_QUIT, MyFrame::OnQuit)
  90.     EVT_MENU(SASHTEST_TOGGLE_WINDOW, MyFrame::OnToggleWindow)
  91.     EVT_SASH_DRAGGED_RANGE(ID_WINDOW_TOP, ID_WINDOW_BOTTOM, MyFrame::OnSashDrag)
  92. END_EVENT_TABLE()
  93.  
  94.  
  95. // Define my frame constructor
  96. MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size,
  97.     const long style):
  98.   wxMDIParentFrame(parent, id, title, pos, size, style)
  99. {
  100.   // Create some dummy layout windows
  101.  
  102.   // A window like a toolbar
  103.   wxSashLayoutWindow* win =
  104.       new wxSashLayoutWindow(this, ID_WINDOW_TOP,
  105.                              wxDefaultPosition, wxSize(200, 30),
  106.                              wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN);
  107.  
  108.   win->SetDefaultSize(wxSize(1000, 30));
  109.   win->SetOrientation(wxLAYOUT_HORIZONTAL);
  110.   win->SetAlignment(wxLAYOUT_TOP);
  111.   win->SetBackgroundColour(wxColour(255, 0, 0));
  112.   win->SetSashVisible(wxSASH_BOTTOM, TRUE);
  113.  
  114.   m_topWindow = win;
  115.  
  116.   // A window like a statusbar
  117.   win = new wxSashLayoutWindow(this, ID_WINDOW_BOTTOM,
  118.                                wxDefaultPosition, wxSize(200, 30),
  119.                                wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN);
  120.   win->SetDefaultSize(wxSize(1000, 30));
  121.   win->SetOrientation(wxLAYOUT_HORIZONTAL);
  122.   win->SetAlignment(wxLAYOUT_BOTTOM);
  123.   win->SetBackgroundColour(wxColour(0, 0, 255));
  124.   win->SetSashVisible(wxSASH_TOP, TRUE);
  125.  
  126.   m_bottomWindow = win;
  127.  
  128.   // A window to the left of the client window
  129.   win = new wxSashLayoutWindow(this, ID_WINDOW_LEFT1,
  130.                                wxDefaultPosition, wxSize(200, 30),
  131.                                wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN);
  132.   win->SetDefaultSize(wxSize(120, 1000));
  133.   win->SetOrientation(wxLAYOUT_VERTICAL);
  134.   win->SetAlignment(wxLAYOUT_LEFT);
  135.   win->SetBackgroundColour(wxColour(0, 255, 0));
  136.   win->SetSashVisible(wxSASH_RIGHT, TRUE);
  137.   win->SetExtraBorderSize(10);
  138.  
  139.   wxTextCtrl* textWindow = new wxTextCtrl(win, -1, _T(""), wxDefaultPosition, wxDefaultSize,
  140.         wxTE_MULTILINE|wxSUNKEN_BORDER);
  141. //        wxTE_MULTILINE|wxNO_BORDER);
  142.   textWindow->SetValue(_T("A help window"));
  143.  
  144.   m_leftWindow1 = win;
  145.  
  146.   // Another window to the left of the client window
  147.   win = new wxSashLayoutWindow(this, ID_WINDOW_LEFT2,
  148.                                wxDefaultPosition, wxSize(200, 30),
  149.                                wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN);
  150.   win->SetDefaultSize(wxSize(120, 1000));
  151.   win->SetOrientation(wxLAYOUT_VERTICAL);
  152.   win->SetAlignment(wxLAYOUT_LEFT);
  153.   win->SetBackgroundColour(wxColour(0, 255, 255));
  154.   win->SetSashVisible(wxSASH_RIGHT, TRUE);
  155.  
  156.   m_leftWindow2 = win;
  157. }
  158.  
  159. void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
  160. {
  161.       Close(TRUE);
  162. }
  163.  
  164. void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
  165. {
  166.       (void)wxMessageBox(_T("wxWindows 2.0 Sash Demo\nAuthor: Julian Smart (c) 1998"), _T("About Sash Demo"));
  167. }
  168.  
  169. void MyFrame::OnToggleWindow(wxCommandEvent& WXUNUSED(event))
  170. {
  171.     if (m_leftWindow1->IsShown())
  172.     {
  173.         m_leftWindow1->Show(FALSE);
  174.     }
  175.     else
  176.     {
  177.         m_leftWindow1->Show(TRUE);
  178.     }
  179.     wxLayoutAlgorithm layout;
  180.     layout.LayoutMDIFrame(this);
  181. }
  182.  
  183. void MyFrame::OnSashDrag(wxSashEvent& event)
  184. {
  185.     if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
  186.         return;
  187.  
  188.     switch (event.GetId())
  189.     {
  190.         case ID_WINDOW_TOP:
  191.         {
  192.             m_topWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height));
  193.             break;
  194.         }
  195.         case ID_WINDOW_LEFT1:
  196.         {
  197.             m_leftWindow1->SetDefaultSize(wxSize(event.GetDragRect().width, 1000));
  198.             break;
  199.         }
  200.         case ID_WINDOW_LEFT2:
  201.         {
  202.             m_leftWindow2->SetDefaultSize(wxSize(event.GetDragRect().width, 1000));
  203.             break;
  204.         }
  205.         case ID_WINDOW_BOTTOM:
  206.         {
  207.             m_bottomWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height));
  208.             break;
  209.         }
  210.     }
  211.     wxLayoutAlgorithm layout;
  212.     layout.LayoutMDIFrame(this);
  213.  
  214.     // Leaves bits of itself behind sometimes
  215.     GetClientWindow()->Refresh();
  216. }
  217.  
  218. void MyFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event))
  219. {
  220.       // Make another frame, containing a canvas
  221.       MyChild *subframe = new MyChild(frame, _T("Canvas Frame"),
  222.                                       wxPoint(10, 10), wxSize(300, 300),
  223.                                       wxDEFAULT_FRAME_STYLE |
  224.                                       wxNO_FULL_REPAINT_ON_RESIZE);
  225.  
  226.       subframe->SetTitle(wxString::Format(_T("Canvas Frame %d"), winNumber));
  227.       winNumber ++;
  228.  
  229.       // Give it an icon (this is ignored in MDI mode: uses resources)
  230. #ifdef __WXMSW__
  231.       subframe->SetIcon(wxIcon(_T("sashtest_icn")));
  232. #endif
  233.  
  234.       // Give it a status line
  235.       subframe->CreateStatusBar();
  236.  
  237.       // Make a menubar
  238.       wxMenu *file_menu = new wxMenu;
  239.  
  240.       file_menu->Append(SASHTEST_NEW_WINDOW, _T("&New window"));
  241.       file_menu->Append(SASHTEST_CHILD_QUIT, _T("&Close child"));
  242.       file_menu->Append(SASHTEST_QUIT, _T("&Exit"));
  243.  
  244.       wxMenu *option_menu = new wxMenu;
  245.  
  246.       // Dummy option
  247.       option_menu->Append(SASHTEST_REFRESH, _T("&Refresh picture"));
  248.  
  249.       wxMenu *help_menu = new wxMenu;
  250.       help_menu->Append(SASHTEST_ABOUT, _T("&About"));
  251.  
  252.       wxMenuBar *menu_bar = new wxMenuBar;
  253.  
  254.       menu_bar->Append(file_menu, _T("&File"));
  255.       menu_bar->Append(option_menu, _T("&Options"));
  256.       menu_bar->Append(help_menu, _T("&Help"));
  257.  
  258.       // Associate the menu bar with the frame
  259.       subframe->SetMenuBar(menu_bar);
  260.  
  261.       int width, height;
  262.       subframe->GetClientSize(&width, &height);
  263.       MyCanvas *canvas = new MyCanvas(subframe, wxPoint(0, 0), wxSize(width, height));
  264.       canvas->SetCursor(wxCursor(wxCURSOR_PENCIL));
  265.       subframe->canvas = canvas;
  266.  
  267.       // Give it scrollbars
  268.       canvas->SetScrollbars(20, 20, 50, 50);
  269.  
  270.       subframe->Show(TRUE);
  271. }
  272.  
  273. BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
  274.     EVT_MOUSE_EVENTS(MyCanvas::OnEvent)
  275. END_EVENT_TABLE()
  276.  
  277. // Define a constructor for my canvas
  278. MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size)
  279.         : wxScrolledWindow(parent, -1, pos, size,
  280.                            wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE)
  281. {
  282.     SetBackgroundColour(* wxWHITE);
  283. }
  284.  
  285. // Define the repainting behaviour
  286. void MyCanvas::OnDraw(wxDC& dc)
  287. {
  288.   dc.SetFont(*wxSWISS_FONT);
  289.   dc.SetPen(*wxGREEN_PEN);
  290.   dc.DrawLine(0, 0, 200, 200);
  291.   dc.DrawLine(200, 0, 0, 200);
  292.  
  293.   dc.SetBrush(*wxCYAN_BRUSH);
  294.   dc.SetPen(*wxRED_PEN);
  295.   dc.DrawRectangle(100, 100, 100, 50);
  296.   dc.DrawRoundedRectangle(150, 150, 100, 50, 20);
  297.  
  298.   dc.DrawEllipse(250, 250, 100, 50);
  299. #if wxUSE_SPLINES
  300.   dc.DrawSpline(50, 200, 50, 100, 200, 10);
  301. #endif // wxUSE_SPLINES
  302.   dc.DrawLine(50, 230, 200, 230);
  303.   dc.DrawText(_T("This is a test string"), 50, 230);
  304.  
  305.   wxPoint points[3];
  306.   points[0].x = 200; points[0].y = 300;
  307.   points[1].x = 100; points[1].y = 400;
  308.   points[2].x = 300; points[2].y = 400;
  309.   
  310.   dc.DrawPolygon(3, points);
  311. }
  312.  
  313. // This implements a tiny doodling program! Drag the mouse using
  314. // the left button.
  315. void MyCanvas::OnEvent(wxMouseEvent& event)
  316. {
  317.   wxClientDC dc(this);
  318.   PrepareDC(dc);
  319.  
  320.   wxPoint pt(event.GetLogicalPosition(dc));
  321.  
  322.   if (xpos > -1 && ypos > -1 && event.Dragging())
  323.   {
  324.     dc.SetPen(*wxBLACK_PEN);
  325.     dc.DrawLine(xpos, ypos, pt.x, pt.y);
  326.   }
  327.   xpos = pt.x;
  328.   ypos = pt.y;
  329. }
  330.  
  331. void MyFrame::OnSize(wxSizeEvent& WXUNUSED(event))
  332. {
  333.     wxLayoutAlgorithm layout;
  334.     layout.LayoutMDIFrame(this);
  335. }
  336.  
  337. // Note that SASHTEST_NEW_WINDOW and SASHTEST_ABOUT commands get passed
  338. // to the parent window for processing, so no need to
  339. // duplicate event handlers here.
  340.  
  341. BEGIN_EVENT_TABLE(MyChild, wxMDIChildFrame)
  342.   EVT_MENU(SASHTEST_CHILD_QUIT, MyChild::OnQuit)
  343. END_EVENT_TABLE()
  344.  
  345. MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size,
  346. const long style):
  347.   wxMDIChildFrame(parent, -1, title, pos, size, style)
  348. {
  349.   canvas = NULL;
  350.   my_children.Append(this);
  351. }
  352.  
  353. MyChild::~MyChild(void)
  354. {
  355.   my_children.DeleteObject(this);
  356. }
  357.  
  358. void MyChild::OnQuit(wxCommandEvent& WXUNUSED(event))
  359. {
  360.       Close(TRUE);
  361. }
  362.  
  363. void MyChild::OnActivate(wxActivateEvent& event)
  364. {
  365.   if (event.GetActive() && canvas)
  366.     canvas->SetFocus();
  367. }
  368.  
  369.