1. 程式人生 > >基於單文件的繪圖及繪圖結果儲存

基於單文件的繪圖及繪圖結果儲存

單文件
1)文件模板類將檢視,框架,文件連線在一起
2)文件類doc
DeleteContents():這個虛擬函式,點選doc類。屬性中 重寫 新增就可以啦
做一些釋放資源的操作,在每次新建 按鈕之前,先呼叫此函式。
OnNewDocument():程式啟動時第一次新建視窗呼叫時,會呼叫此函式,以後每次點選 新建都會呼叫此函式。

每次都是先DeleteContents 然後呼叫OnNewDocument()函式。
3)檢視類 處理滑鼠左鍵,右鍵
框架類是一個容器

程式功能:在單文件介面畫橢圓,點選儲存時能儲存點的位置,點選新建時繪圖消失,點選開啟相應檔案時,把之前的繪圖顯示出來。
知識點:

  1. 在DOC中
    在.h中新增共有變數 CPoint m_pt[200];
    int m_nNum;
    在DeleteContents函式給上面兩個變數初始化,如果有動態記憶體分配的,此時要釋放記憶體
  2. 在View中
    滑鼠左鍵按下: 重新整理doc類中變數和點座標的值,並用invalidate重新整理繪圖
    在OnDraw中 繪圖
    3.儲存與開啟上次座標資料 :
    點選點選儲存按鈕:利用doc中Serialize 中ar << m_nNum; 將資料儲存
    開啟:ar >> m_nNum; 就會有繪圖啦
//Doc.h
public:
	CPoint m_pt[200];
	int m_nNum;
	virtual void DeleteContents();
//Doc.cpp

// CArchivePro01Doc 序列化

void CArchivePro01Doc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: 在此新增儲存程式碼
		ar << m_nNum;
		for (int i = 0;i < m_nNum;i++)
		{
			ar << m_pt[i];//cout功能
		}
	}
	else
	{
		// TODO: 在此新增載入程式碼
		ar >> m_nNum;
		for (int i = 0;i < m_nNum;i++)
		{
			ar >> m_pt[i];
		}
	}
}


void CArchivePro01Doc::DeleteContents()
{
	// TODO: 在此新增專用程式碼和/或呼叫基類
	//單文件初始化在此處哦
	memset(m_pt,0,sizeof(m_pt));
	m_nNum = 0;
	CDocument::DeleteContents();
}

在檢視類中
新增WM_LBUTTONDOWN訊息

void CArchivePro01View::OnDraw(CDC* pDC)
{
	CArchivePro01Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此處為本機資料新增繪製程式碼
	for (int i = 0;i < pDoc->m_nNum;i++)
	{
		pDC->Ellipse(pDoc->m_pt[i].x - 5, pDoc->m_pt[i].y - 5
			, pDoc->m_pt[i].x + 5, pDoc->m_pt[i].y + 5);
	}
}


void CArchivePro01View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值
	CArchivePro01Doc * pDoc = GetDocument();
	if (pDoc->m_nNum > 200)
	{
		pDoc->m_nNum = 200;
		return;
	}
	pDoc->m_pt[pDoc->m_nNum] = point;
	pDoc->m_nNum++;

	//開始會提就可以啦
	Invalidate();//OnDraw呼叫繪圖

	CView::OnLButtonDown(nFlags, point);
}