본문 바로가기

Windows/MFC

SHAPE

[code]
// ShapeExView.cpp : implementation of the CShapeExView class
//

#include "stdafx.h"
#include "ShapeEx.h"

#include "ShapeExDoc.h"
#include "ShapeExView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CShapeExView

IMPLEMENT_DYNCREATE(CShapeExView, CView)

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

/////////////////////////////////////////////////////////////////////////////
// CShapeExView construction/destruction

CShapeExView::CShapeExView()
{
    m_bShape = TRUE;
}

CShapeExView::~CShapeExView()
{
}

BOOL CShapeExView::PreCreateWindow(CREATESTRUCT& cs)
{
    // the CREATESTRUCT cs

    return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CShapeExView drawing

void CShapeExView::OnDraw(CDC* pDC)
{
    CShapeExDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    if(m_bShape)
    {
        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);
    }

}

/////////////////////////////////////////////////////////////////////////////
// CShapeExView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CShapeExView message handlers

void CShapeExView::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); // 노란색 브러쉬 선택

    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 CShapeExView::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 CShapeExView::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 CShapeExView::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 CShapeExView::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 CShapeExView::OnMouseMove(UINT nFlags, CPoint point)
{
    if(m_bShape)
    {
        m_curPos = point; // 현재 커서의 위치 설정
        InvalidateRect(m_rcStatus, FALSE);
    }    
    CView::OnMouseMove(nFlags, point);
}

void CShapeExView::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 CShapeExView::OnRButtonDown(UINT nFlags, CPoint point)
{
    
    m_bShape = !m_bShape; // 토글 형식으로 m_bShape 값이 변경된다.
    Invalidate(); // 화면을 다시 그린다.    

    CView::OnRButtonDown(nFlags, point);
}


BOOL CShapeExView::OnEraseBkgnd(CDC* pDC)
{
    // 클라이언트 영역을 변경하기
    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]

'Windows > MFC' 카테고리의 다른 글

ImageView 이미지  (0) 2013.10.02
OnNcCreate 삼각,둥근 윈도우  (0) 2013.10.02
brush  (0) 2013.10.02
도형그리기 (CPen, CBrush, Rectangle, Arc, LineTo, Ellipse)  (0) 2013.10.02
시스템 폰트 얻기 system font  (0) 2013.10.02