Prev Next Up Title Contents Index

mfc\mopocad.cpp

Seuraavassa MopoCadin toteutuksesta Microsoftin Foundation Class -luokkakirjastoa käyttäen. Koska STL- kirjastoa ei yrityksistä huolimatta saatu toimimaan, on se korvattu "omatekoisella" luokalla, jossa on ulospäin samat toiminnot.

apf\mfc\mopocad.cpp - MFC -versio

	// mopocad.cpp
	// Mopocad for Visual C++ 4.0/vl-96
	#include <afxwin.h>
	#include "..\mopocad.rh"
	
	
	//-----------------------------------------------------------------------------
	// Koska STL:aa ei saatu yli 10 h kokeiluista huolimatta toimimaan,
	// rakennetaan tilalle vastaavat toiminnot (jotka riittavat tahan esim)
	// MFC:n omalla CArray -sailo-luokalla.
	#include <afxtempl.h>
	
	class cPoints {  // Sailoluokka joka osaa tallettaa vain pisteitä
	  CArray<CPoint,CPoint> points;
	public:
	  class cPIte { // Iteraattori, jolla sailoluokkaa voidaan kasitella
	    int i;
	    cPoints *p;
	  public:
	    friend cPoints;
	    cPIte()                               { i=0; p = NULL;       }
	    cPIte(int ii,cPoints *ip)             { i= ii; p = ip;       }
	    CPoint &operator*() const             { return p->points[i]; }
	    int operator!=(const cPIte &i2) const { return i != i2.i;    }
	    cPIte &operator++()                   { i++; return *this;   }
	    cPIte &operator++(int)                { i++; return *this;   }
	  }; // cPIte
	  friend cPoints::cPIte;
	  void push_back(const CPoint &pt)      { points.Add(pt);                     }
	  cPIte begin()                         { return cPIte(0,this);               }
	  cPIte end()                           { return cPIte(points.GetSize(),this);}
	  void erase(const cPIte &b, const cPIte &e) { points.RemoveAt(b.i,e.i-b.i);  }
	}; // cPoints
	
	typedef cPoints::cPIte cPointsIterator;
	//-----------------------------------------------------------------------------
	
	CPoint MovePoint(-2000,-2000); // Merkki taulukkoon siirrosta
	
	//-----------------------------------------------------------------------------
	class CMainWindow : public CFrameWnd {
	  CClientDC *HoldDC;
	  BOOL      ButtonDown;
	  cPoints   Points;
	protected:
	  void DeleteAllPoints();
	  void ClearWindow();
	public:
	  CMainWindow();
	  ~CMainWindow() { DeleteAllPoints(); }
	  virtual void Exit();
	  virtual void About();
	  void OnLButtonDown(UINT nFlags,CPoint point);
	  void OnMouseMove(UINT nFlags,CPoint point);
	  void OnLButtonUp(UINT nFlags,CPoint point);
	  void OnRButtonDown(UINT nFlags,CPoint point);
	  void OnPaint();
	  DECLARE_MESSAGE_MAP()
	};
	
	BEGIN_MESSAGE_MAP( CMainWindow, CFrameWnd )
	  ON_COMMAND(CM_FILE_EXIT, Exit)
	  ON_COMMAND(CM_HELP_ABOUT, About)
	  ON_WM_LBUTTONDOWN()
	  ON_WM_MOUSEMOVE()
	  ON_WM_LBUTTONUP()
	  ON_WM_RBUTTONDOWN()
	  ON_WM_PAINT()
	END_MESSAGE_MAP()
	
	
	//-----------------------------------------------------------------------------
	class CDLG_AboutDlg : public CDialog{ // Tässä tarpeeton, ks. CMainWin::About!
	public:
	  CDLG_AboutDlg(LPCTSTR name,CWnd *Parent): CDialog(name,Parent) {}
	  virtual void Ok();
	  DECLARE_MESSAGE_MAP()
	};
	
	BEGIN_MESSAGE_MAP( CDLG_AboutDlg, CDialog )
	  ON_COMMAND(IDOK, Ok)
	END_MESSAGE_MAP()
	
	//-------------------- CDLG_AboutDlg metodit: ---------------------------------
	void CDLG_AboutDlg::Ok()
	{
	  EndDialog(0);
	}
	
	//-----------------------------------------------------------------------------
	CMainWindow::CMainWindow() 
	{ 
	  Create(NULL,"MopoCad"); 
	  ButtonDown = FALSE;
	  HoldDC = NULL;
	
	  LoadAccelTable("PIKA");
	
	  CMenu menu;
	  menu.LoadMenu("PAAMENU");
	  SetMenu(&menu);
	  menu.Detach();
	}
	
	void CMainWindow::Exit()
	{
	  DestroyWindow();
	}
	
	void CMainWindow::About()
	{
	// Tosin voitaisiin kutsua suoraan geneeristä CDialog ja jättää
	// koko CDLG_AboutDlg luokka pois!
	//    CDialog dlg("DLG_ABOUT",this);
	  CDLG_AboutDlg dlg("DLG_ABOUT",this);
	  dlg.DoModal();
	}
	
	void CMainWindow::OnLButtonDown(UINT ,CPoint point)
	{
	  if ( ButtonDown ) return;
	  ButtonDown = TRUE;
	  SetCapture();
	  HoldDC = new CClientDC(this);
	  HoldDC->MoveTo(point);
	  Points.push_back(MovePoint);
	  Points.push_back(point);
	}
	
	void CMainWindow::OnMouseMove(UINT ,CPoint point)
	{
	  if ( !ButtonDown ) return;
	  HoldDC->LineTo(point);
	  Points.push_back(point);
	}
	
	void CMainWindow::OnLButtonUp(UINT ,CPoint)
	{
	  if ( !ButtonDown ) return;
	  ReleaseCapture();
	  delete HoldDC;
	  HoldDC = NULL;
	  ButtonDown = FALSE;
	}
	
	void CMainWindow::OnRButtonDown(UINT ,CPoint)
	{
	  if ( ButtonDown ) return;
	  ClearWindow();
	}
	
	void CMainWindow::OnPaint() {
	  CPaintDC hdc(this);
	  cPointsIterator pi;
	  for (pi=Points.begin(); pi != Points.end() ; pi++)
	    if ( *pi == MovePoint ) hdc.MoveTo(*++pi); 
	    else hdc.LineTo(*pi);
	}
	
	void CMainWindow::DeleteAllPoints()
	{
	  Points.erase(Points.begin(),Points.end());
	}
	
	void CMainWindow::ClearWindow()
	{
	  DeleteAllPoints();
	  Invalidate(TRUE);
	}
	
	//-----------------------------------------------------------------------------
	class CMopoCadApp : public CWinApp {
	public:
	  virtual BOOL InitInstance() {
	    m_pMainWnd = new CMainWindow();
	    m_pMainWnd->ShowWindow(m_nCmdShow);
	    m_pMainWnd->UpdateWindow();
	    m_pMainWnd->SetIcon(LoadIcon("IKONI"),TRUE);
	
	    return TRUE;
	  }
	};
	
	CMopoCadApp MopoCadApp;  //  constructor initializes and runs the app


Prev Next Up Title Contents Index