Programming/MFC

(MFC) Example 10 : FormView(GDI)

부풍 2009. 8. 24. 16:29

CFormView 계승

Resource Editor를 이용한 다이얼로그 작성

  • IDC_RED, IDC_GREEN, IDC_BLUE
  • IDC_CIRCLE, IDC_RECTANGLE
  • IDC_5PIX, IDC_10PIX
  • IDC_DRAW
  • 순서를 정하고 (서식 - 탭순서)
  • IDC_RED, IDC_CIRCLE 만 Group 속성 Check

CEx10View

#define RED		1
#define GREEN	2
#define BLUE	3
 
#define CIRCLE	1
#define RECTANGLE 2
 
#define PIX5	5
#define PIX10	10
 
class CEx10View : public CFormView
{
// ~~~~
 
private:
	int m_nColor;
	int m_nShape;
	int m_nLineWidth;

Message 처리

void CEx10View::OnBnClickedBlue()
{
	m_nColor = BLUE;
}
 
void CEx10View::OnBnClickedRed()
{
	m_nColor = RED;
}
 
void CEx10View::OnBnClickedGreen()
{
	m_nColor = GREEN;
}
 
void CEx10View::OnBnClickedCircle()
{
	m_nShape = CIRCLE;
}
 
void CEx10View::OnBnClickedRectangle()
{
	m_nShape = RECTANGLE;
}

새로 그리기

void CEx10View::OnBnClickedDraw()
{
	Invalidate();
}

Check Button 메시지 처리

void CEx10View::OnBnClicked10pix()
{
	CButton *pButton = (CButton*)GetDlgItem(IDC_10PIX);
	if (pButton->GetCheck() == BST_CHECKED) {
		m_nLineWidth =  PIX10;
		pButton = (CButton*)GetDlgItem(IDC_5PIX);
		pButton->SetCheck(BST_UNCHECKED);
	}
}
 
void CEx10View::OnBnClicked5pix()
{
	CButton *pButton = (CButton*)GetDlgItem(IDC_5PIX);
	if (pButton->GetCheck() == BST_CHECKED) {
		m_nLineWidth = PIX5;
		pButton = (CButton*)GetDlgItem(IDC_10PIX);
		pButton->SetCheck(BST_UNCHECKED);
	}
}

OnPaint

void CEx10View::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 여기에 메시지 처리기 코드를 추가합니다.
	// 그리기 메시지에 대해서는 CFormView::OnPaint()을(를) 호출하지 마십시오.
	CBrush brush;
	switch(m_nColor) {
		case RED :
			brush.CreateSolidBrush(RGB(255, 0, 0));
			break;
		case GREEN :
			brush.CreateSolidBrush(RGB(0, 255, 0));
			break;
		default :
			brush.CreateSolidBrush(RGB(0, 0, 255));
			break;
	}
	CBrush *pOrgBrush = dc.SelectObject(&brush);
 
	CPen pen;
	switch(m_nLineWidth) {
		case PIX5 :
			pen.CreatePen(PS_SOLID, PIX5, RGB(0, 0, 0));
			break;
		default :
			pen.CreatePen(PS_SOLID, PIX10, RGB(0, 0, 0));
			break;
	}
	CPen *pOrgPen = dc.SelectObject(&pen);
 
	switch(m_nShape) {
		case CIRCLE : // Circle
			dc.Ellipse(200, 50, 400, 250);
			break;
		default :
			dc.Rectangle(200, 50, 400, 250);
			break;
	}
	dc.SelectObject(pOrgBrush);
	dc.SelectObject(pOrgPen);
}