001: #include <wx/wx.h> 002: 003: /** 004: A window on which the program user can draw 005: a triangle by clicking on the three corners. 006: */ 007: class TriangleWindow : public wxWindow 008: { 009: public: 010: /** 011: Initializes the base class. 012: @param parent the parent window 013: */ 014: TriangleWindow(wxWindow* parent); 015: /** 016: Paints the corners and lines that have already been 017: entered. 018: @param event the event descriptor 019: */ 020: void OnPaint(wxPaintEvent& event); 021: /** 022: Adds another corner to the triangle. 023: @param event the event descriptor 024: */ 025: void OnMouseEvent(wxMouseEvent& event); 026: private: 027: int x[3]; 028: int y[3]; 029: int corners; 030: DECLARE_EVENT_TABLE() 031: }; 032: 033: /** 034: A frame with a window that shows a triangle. 035: */ 036: class MouseFrame : public wxFrame 037: { 038: public: 039: /** 040: Constructs the window. 041: */ 042: MouseFrame(); 043: private: 044: TriangleWindow* window; 045: }; 046: 047: /** 048: An application to demonstrate mouse event handling. 049: */ 050: class MouseApp : public wxApp 051: { 052: public: 053: /** 054: Constructs the frame. 055: */ 056: MouseApp(); 057: /** 058: Shows the frame. 059: @return true 060: */ 061: virtual bool OnInit(); 062: private: 063: MouseFrame* frame; 064: }; 065: 066: DECLARE_APP(MouseApp) 067: 068: IMPLEMENT_APP(MouseApp) 069: 070: BEGIN_EVENT_TABLE(TriangleWindow, wxWindow) 071: EVT_MOUSE_EVENTS(TriangleWindow::OnMouseEvent) 072: EVT_PAINT(TriangleWindow::OnPaint) 073: END_EVENT_TABLE() 074: 075: TriangleWindow::TriangleWindow(wxWindow* parent) 076: : wxWindow(parent, -1) 077: { 078: corners = 0; 079: } 080: 081: void TriangleWindow::OnMouseEvent(wxMouseEvent& event) 082: { 083: if (event.ButtonDown() && corners < 3) 084: { 085: x[corners] = event.GetX(); 086: y[corners] = event.GetY(); 087: corners++; 088: Refresh(); 089: } 090: } 091: 092: void TriangleWindow::OnPaint(wxPaintEvent& event) 093: { 094: const int RADIUS = 2; 095: wxPaintDC dc(this); 096: dc.SetBrush(*wxTRANSPARENT_BRUSH); 097: if (corners == 1) 098: dc.DrawEllipse(x[0] - RADIUS, y[0] - RADIUS, 099: 2 * RADIUS, 2 * RADIUS); 100: if (corners >= 2) 101: dc.DrawLine(x[0], y[0], x[1], y[1]); 102: if (corners >= 3) 103: { 104: dc.DrawLine(x[1], y[1], x[2], y[2]); 105: dc.DrawLine(x[2], y[2], x[0], y[0]); 106: } 107: } 108: 109: MouseFrame::MouseFrame() 110: : wxFrame(NULL, -1, "MouseFrame") 111: { 112: window = new TriangleWindow(this); 113: } 114: 115: MouseApp::MouseApp() 116: { 117: frame = new MouseFrame(); 118: } 119: 120: bool MouseApp::OnInit() 121: { 122: frame->Show(true); 123: return true; 124: }