GDI(2)-색깔 상자

유혜정·2022년 4월 14일
0

색깔 상자 그리기

----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);
}

ReSize해도 안사라지게 하기

view에서만 작성

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에 작성

----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();
}
profile
내가 시작한 공부, 공유할 코드

0개의 댓글