#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; //建立應用程式物件