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: }