Windows/MFC

도형그리기 (CPen, CBrush, Rectangle, Arc, LineTo, Ellipse)

aucd29 2013. 10. 2. 13:54
[code]
// SHAPE_EX2View.cpp : implementation of the CSHAPE_EX2View class
//

#include "stdafx.h"
#include "SHAPE_EX2.h"

#include "SHAPE_EX2Doc.h"
#include "SHAPE_EX2View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSHAPE_EX2View

IMPLEMENT_DYNCREATE(CSHAPE_EX2View, CView)

BEGIN_MESSAGE_MAP(CSHAPE_EX2View, CView)
    //{{AFX_MSG_MAP(CSHAPE_EX2View)
    ON_WM_RBUTTONDOWN()
    ON_WM_MOUSEMOVE()
    ON_WM_ERASEBKGND()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSHAPE_EX2View construction/destruction

CSHAPE_EX2View::CSHAPE_EX2View()
{
    m_bShape = TRUE; // OnDraw()에 속성을 주기위해 미리 설정
}

CSHAPE_EX2View::~CSHAPE_EX2View()
{
}

BOOL CSHAPE_EX2View::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    // the CREATESTRUCT cs

    return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSHAPE_EX2View drawing

void CSHAPE_EX2View::OnDraw(CDC* pDC)
{
    CSHAPE_EX2Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    if(m_bShape)            // m_bShape 가 TRUE 이기때문에 아래의 클래스 호출
    {
        ShowRect(pDC);        // 사각형
        ShowCircle(pDC);    // 원
        ShowLine(pDC);        // 선
        ShowCursorPos(pDC);    // 마우스 위치 알아내기
        ShowRainbow(pDC);    // 무지개 그리기
    }
    else                    // 아니라문 글자를 때려주자
    {
        m_nLine = 0;
        for(int i = 20; i <= 60; i+= 5)
            ShowFont(pDC, i);
    }
}

/////////////////////////////////////////////////////////////////////////////
// CSHAPE_EX2View diagnostics

#ifdef _DEBUG
void CSHAPE_EX2View::AssertValid() const
{
    CView::AssertValid();
}

void CSHAPE_EX2View::Dump(CDumpContext& dc) const
{
    CView::Dump(dc);
}

CSHAPE_EX2Doc* CSHAPE_EX2View::GetDocument() // non-debug version is inline
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSHAPE_EX2Doc)));
    return (CSHAPE_EX2Doc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSHAPE_EX2View message handlers

void CSHAPE_EX2View::ShowRect(CDC *pDC)
{
    // 사각형 출력하기
    CPen myPen, *pOldPen;
    CBrush myBrush, *pOldBrush;

    myPen.CreatePen(PS_SOLID, 5, RGB(0, 0, 255));    // 굵기 5 픽셀의 파란색 솔리드 펜 생성
    myBrush.CreateSolidBrush(RGB(255, 255, 0));        // 노란색 솔리드 브러쉬 생성

    pOldPen = pDC->SelectObject(&myPen);            // 파란색 펜 선택
    pOldBrush = pDC->SelectObject(&myBrush);        // 노란색 브러쉬 선택

            // top x,y    bottom x,y
    pDC->Rectangle(10, 10, 300, 200);                // 사각형을 그린다. 파랑테두리,노랑속

    pDC->SelectObject(pOldPen);                        // 기존 펜으로 환원
    pDC->SelectObject(pOldBrush);                    // 기존 브러쉬로 환원

    // 커서의 현재 위치를 출력할 프레임 그리기
    CRect rc;
    GetClientRect(rc);
    m_rcStatus.SetRect(rc.left, rc.Height()-30, rc.right, rc.bottom);
    pDC->DrawFrameControl(m_rcStatus, DFC_BUTTON|DFCS_BUTTONPUSH, 0);
}

void CSHAPE_EX2View::ShowRainbow(CDC *pDC)
{
    COLORREF color;
    CPen myPen, *pOldPen;
    
    for(int i = 0; i < 35; i+=5)
    {
        color = RGB(rand()%256, rand()%256, rand()%256); // 임의의 색상 설정
        myPen.CreatePen(PS_SOLID, 5, color);

        pOldPen = pDC->SelectObject(&myPen);

        pDC->Arc(300+i, 50+i, 500-i, 260-i, 600, 160, 0, 160); // 원호를 그린다.

        pDC->SelectObject(pOldPen);
        myPen.DeleteObject();
    }
}

void CSHAPE_EX2View::ShowLine(CDC *pDC)
{
// 선 출력하기
    CPen* pOldPen;
    pOldPen = (CPen*)pDC->SelectStockObject(BLACK_PEN); // 내장 펜 사용

    pDC->MoveTo(10, 10); // 시작점으로 이동
    pDC->LineTo(300, 200); // 선을 그린다.

    pDC->MoveTo(10, 200); // 시작점으로 이동
    pDC->LineTo(300, 10); // 선을 그린다.

    pDC->SelectObject(pOldPen); // 기존 펜으로 환원
}

void CSHAPE_EX2View::ShowFont(CDC *pDC, int nPoint)
{
    TEXTMETRIC tm;
    CFont myFont, *pOldFont;

    // 폰트 생성
    myFont.CreateFont(nPoint, 0, 0, 0, 700, TRUE, FALSE, 0,
                    ANSI_CHARSET,OUT_DEFAULT_PRECIS,
                    CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
                    DEFAULT_PITCH|FF_SWISS, "Arial");

    pOldFont = pDC->SelectObject(&myFont); // 새로운 폰트 선택
    pDC->SetBkMode(TRANSPARENT); // 투명 모드 설정
    pDC->TextOut(10, m_nLine, "한국정보기술연구원"); // 텍스트 출력

    pDC->GetTextMetrics(&tm); // 현재 화면에 출력된 텍스트의 정보 얻음
    pDC->SelectObject(pOldFont); // 환원

    m_nLine += (tm.tmHeight+tm.tmExternalLeading); // 문자의 전체 높이
}

void CSHAPE_EX2View::ShowCursorPos(CDC *pDC)
{
    CString str;
    str.Format("X좌표:%3d, Y좌표:%3d", m_curPos.x, m_curPos.y);

    //pDC->SetBkMode(OPAQUE); // 불투명 모드 설정(디폴트)
    pDC->SetBkMode(TRANSPARENT); // 투명 모드 설정
    pDC->SetTextColor(RGB(0, 0, 255)); // 텍스트 색상 설정
    pDC->DrawText(str, m_rcStatus, DT_CENTER|DT_VCENTER|DT_SINGLELINE); // 텍스
}

void CSHAPE_EX2View::ShowCircle(CDC *pDC)
{
// 타원 출력하기
    CPen myPen, *pOldPen;
    CBrush *pOldBrush;

    myPen.CreatePen(PS_DOT, 1, RGB(255, 0, 0)); // 빨간색 점선 펜 생성

    pOldPen = pDC->SelectObject(&myPen); // 빨간색 점선 펜 선택
    pOldBrush = (CBrush*)pDC->SelectStockObject(LTGRAY_BRUSH); // 내장 브러쉬 선택

    pDC->Ellipse(150, 100, 300, 300); // 타원을 그린다.

    pDC->SelectObject(pOldPen); // 기존 펜으로 환원
    pDC->SelectObject(pOldBrush); // 기존 브러쉬로 환원
}

void CSHAPE_EX2View::OnRButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
    m_bShape = !m_bShape; // 토글 형식으로 m_bShape 값이 변경된다.
    Invalidate(); // 화면을 다시 그린다.    
    CView::OnRButtonDown(nFlags, point);
}

void CSHAPE_EX2View::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
    if(m_bShape)
    {
        m_curPos = point; // 현재 커서의 위치 설정
        InvalidateRect(m_rcStatus, FALSE);
    }    
    CView::OnMouseMove(nFlags, point);
}

BOOL CSHAPE_EX2View::OnEraseBkgnd(CDC* pDC)
{
    // TODO: Add your message handler code here and/or call default
    // 클라이언트 영역을 변경하기
    CBrush myBrush, *pOldBrush;
    myBrush.CreateHatchBrush(HS_VERTICAL, RGB(0, 255, 0)); // 녹색의 수직 해칭 브러쉬 생성
    pOldBrush = pDC->SelectObject(&myBrush); // 녹색 해칭브러쉬 선택

    CRect rc;
    GetClientRect(rc);
    pDC->FillRect(rc, &myBrush); // 클라이언트 영역을 녹색 해칭 브러쉬로 채운다.

    pDC->SelectObject(pOldBrush); // 기존 브러쉬로 환원
    
    return TRUE;
    //return CView::OnEraseBkgnd(pDC);
}
[/code]