#include <afxwin.h>
#include "resource.h"
#include <afxtempl.h> //定義樣板類別的標頭檔

class MyDoc : public CDocument //Document的資料儲存
{
public:
	CArray<CPoint, CPoint &> pArray; //容納滑鼠軌跡的Array容器

	void AddPoint(CPoint p) //將軌跡點加到容器內
	{
		pArray.Add(p);	
	}

	CPoint GetPoint(int i) //將軌跡點從容器中取出
	{
		return pArray[i];	
	}

	int GetSiez() //取得容器的大小
	{
		return pArray.GetSize();
	}

	DECLARE_DYNCREATE(MyDoc) //宣告 run-time類別
	DECLARE_MESSAGE_MAP() //宣告訊息映射表
};

IMPLEMENT_DYNCREATE(MyDoc,CDocument) //宣告MyDoc為run-time類別
BEGIN_MESSAGE_MAP(MyDoc,CDocument) //建立訊息映射表
END_MESSAGE_MAP()

class MyView : public CView //將儲存的資料顯示
{
public:
	void OnDraw(CDC * aDC) //複寫OnDraw(必須複寫的虛擬函數)
	{
		MyDoc *doc = (MyDoc *)GetDocument(); //取得目前Document物件的指標
		int num = doc->GetSiez(); //取得目前儲存的軌跡點點數
		int i;

		for (i = 0; i < num; ++i) //將MyDOc中儲存的軌跡點重繪到視窗上
		{
			CPoint point = doc->GetPoint(i); //取出doc物件中儲存的第i個滑鼠軌跡點
			aDC->SetPixel(point, RGB(255, 0, 0)); //將滑鼠軌跡點繪於畫布上
		}
	}

	afx_msg void OnButtonDown(UINT , CPoint point)
	{
		SetCapture();
	} //取得滑鼠訊息的接收權

	afx_msg void OnMouseMove(UINT , CPoint point)
	{
		if (this == GetCapture()) //GetCapture()函數檢查滑鼠游標是否在這個應用程式的視窗上
		{
			CClientDC aDC(this); //建立畫布
			aDC.SetPixel(point, RGB(255, 0, 0)); //將點畫在畫布上
			MyDoc *doc = (MyDoc *)GetDocument(); //取得目前Doc物件的指標
			doc->AddPoint(point); //將軌跡點加入Doc物件中
		}
	}

	afx_msg	void OnLButtonUp(UINT , CPoint point)
	{
		ReleaseCapture(); //解放滑鼠訊息的接收權
	}

	DECLARE_DYNCREATE(MyView) //宣告run-time類別
	DECLARE_MESSAGE_MAP() //宣告訊息映射表
};

IMPLEMENT_DYNCREATE(MyView,CView) //宣告MyView為run-time類別
BEGIN_MESSAGE_MAP(MyView,CView)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
END_MESSAGE_MAP() //建立訊息映射表

class MyFrame : public CFrameWnd
{
	DECLARE_DYNCREATE(MyFrame) //宣告 run-time類別
	DECLARE_MESSAGE_MAP() //宣告訊息映射表
};

IMPLEMENT_DYNCREATE(MyFrame,CFrameWnd) //宣告MyFrame為run-time類別
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd) //建立訊息映射表
END_MESSAGE_MAP()

class MyApp : public CWinApp
{
public:
	BOOL InitInstance()
	{
		CDocument *doc; //宣告指向文件的指標
		CSingleDocTemplate* DocTemplate; //宣告指向單文件樣板物件的指標
		DocTemplate = new CSingleDocTemplate( //建立具有單文件樣板物件
			IDR_MENU1, //用於單文件框架之資源的識別子
			RUNTIME_CLASS(MyDoc), //單文字視窗的Document
			RUNTIME_CLASS(MyFrame),//單文字視窗的視窗框架
			RUNTIME_CLASS(MyView)//單文字視窗的View
			);

		AddDocTemplate(DocTemplate); //將單文件樣板物件設定給MyApp
		doc = DocTemplate->CreateNewDocument(); //建立新的文件

		m_pMainWnd = DocTemplate->CreateNewFrame(doc, NULL); //建立一個視窗框架
		DocTemplate->InitialUpdateFrame((CFrameWnd*)m_pMainWnd, doc); //起始化視窗框架物件，並連接View物件
		m_pMainWnd->ShowWindow(SW_SHOW); //顯示視窗

		return true;
	}
}a_app; //建立應用程式物件