基於單文件的繪圖及繪圖結果儲存
阿新 • • 發佈:2019-01-02
單文件
1)文件模板類將檢視,框架,文件連線在一起
2)文件類doc
DeleteContents():這個虛擬函式,點選doc類。屬性中 重寫 新增就可以啦
做一些釋放資源的操作,在每次新建 按鈕之前,先呼叫此函式。
OnNewDocument():程式啟動時第一次新建視窗呼叫時,會呼叫此函式,以後每次點選 新建都會呼叫此函式。
每次都是先DeleteContents 然後呼叫OnNewDocument()函式。
3)檢視類 處理滑鼠左鍵,右鍵
框架類是一個容器
程式功能:在單文件介面畫橢圓,點選儲存時能儲存點的位置,點選新建時繪圖消失,點選開啟相應檔案時,把之前的繪圖顯示出來。
知識點:
- 在DOC中
在.h中新增共有變數 CPoint m_pt[200];
int m_nNum;
在DeleteContents函式給上面兩個變數初始化,如果有動態記憶體分配的,此時要釋放記憶體 - 在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);
}