----view.cpp
// CReDrawDemoView 그리기
void CReDrawDemoView::OnDraw(CDC* pDC)
{
CReDrawDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
CPen pen(PS_SOLID, 10, RGB(255, 0, 0));
// 펜스타일, 굵기, 색상
CPen* pOldPen = pDC->SelectObject(&pen); // 주소 복사
pDC->Rectangle(100, 100, 200, 200);
pDC->SelectObject(pOldPen); // 원래대로 변경
}
----view.cpp
void CReDrawDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CClientDC dc(this);
CPen pen(PS_SOLID, 10, RGB(255, 0, 0));
CPen* pOldPen = dc.SelectObject(&pen);
dc.Rectangle(point.x, point.y, point.x+100, point.y+100);
dc.SelectObject(pOldPen);
CView::OnLButtonDown(nFlags, point);
}
OnDraw에 그려서 사라지지 않게 하기
----view.h
#include <vector>
using namespace std;
////////
// 작업입니다.
public:
void Draw(int x, int y, CDC* pDC);
vector<CPoint> m_array;
----view.cpp
void CReDrawDemoView::OnDraw(CDC* pDC)
{
CReDrawDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
CPen pen(PS_SOLID, 10, RGB(255, 0, 0));
// 펜스타일, 굵기, 색상
CPen* pOldPen = pDC->SelectObject(&pen); // 주소 복사
for (const CPoint& pt : m_array) {
pDC->Rectangle(pt.x, pt.y, pt.x + 100, pt.y + 100);
}
pDC->SelectObject(pOldPen); // 원래대로 변경
}
////////
void CReDrawDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
m_array.push_back(point);
Invalidate(); // 또는 RedrawWindow();
CView::OnLButtonDown(nFlags, point);
}
Invalidate()의 단점
----view.cpp
void CReDrawDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CClientDC dc(this);
CPen pen(PS_SOLID, 10, RGB(255, 0, 0));
CPen* pOldPen = dc.SelectObject(&pen);
dc.Rectangle(point.x, point.y, point.x+100, point.y+100);
dc.SelectObject(pOldPen);
m_array.push_back(point);
//Invalidate(); // 또는 RedrawWindow();
CView::OnLButtonDown(nFlags, point);
}
----doc.h
#include <vector>
using namespace std;
////////
// 작업입니다.
public:
vector<CPoint> m_array;
----doc.cpp
BOOL CReDrawDemoDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: 여기에 재초기화 코드를 추가합니다.
// SDI 문서는 이 문서를 다시 사용합니다.
vector<CPoint> m_array; // Document의 초기화
return TRUE;
}
////////
void CReDrawDemoDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
ar << m_array.size();
for (const CPoint& pt : m_array) {
ar << pt.x;
ar << pt.y;
}
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
int m_size;
int x, y;
ar >> m_size;
for (int i = 0; i < m_size; i++) {
ar >> x;
ar >> y;
m_array.push_back(CPoint(x, y));
}
}
}
----view.h
//#include <vector>
//using namespace std;
////////
// 작업입니다.
public:
void Draw(int x, int y, CDC* pDC);
//vector<CPoint> m_array;
----view.cpp
void CReDrawDemoView::OnDraw(CDC* pDC)
{
CReDrawDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
CPen pen(PS_SOLID, 10, RGB(255, 0, 0));
// 펜스타일, 굵기, 색상
CPen* pOldPen = pDC->SelectObject(&pen); // 주소 복사
for (const CPoint& pt : pDoc->m_array) {
pDC->Rectangle(pt.x, pt.y, pt.x + 100, pt.y + 100);
}
pDC->SelectObject(pOldPen); // 원래대로 변경
}
///////
void CReDrawDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CClientDC dc(this);
CPen pen(PS_SOLID, 10, RGB(255, 0, 0));
CPen* pOldPen = dc.SelectObject(&pen);
dc.Rectangle(point.x, point.y, point.x+100, point.y+100);
dc.SelectObject(pOldPen);
CReDrawDemoDoc* pDoc = GetDocument();
pDoc->m_array.push_back(point);
pDoc->SetModifiedFlag();
//Invalidate(); // 또는 RedrawWindow();
CView::OnLButtonDown(nFlags, point);
}
새로만들기를 누르면 빈 화면 나오게 하기
----doc.cpp
void CReDrawDemoDoc::DeleteContents()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
m_array.clear();
CDocument::DeleteContents();
}