본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 7 GDI - 5 실습 예제

실은 미완성..[4번문제가 너무 노가다성이 강해서+ 내 방식이 맞는거같아보이질 않아서..]

이지만 코드파일과 설명 올려봄미다.

으헝헝

페이지 227. 

1번 문제.

전형적인 예제를 생성하여 크기가 120 120 인 정사각형을 출력하시오.

매우 쉬운 문제.

함수 하나면 됩니다.[속성같은거 정하는게 아니니]

OnPaint

메시지핸들러를 추가해주시고


void CEXGDIView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.


dc.Rectangle(20,20,140,140); //사각형을 그리는 함수

}
 
끝.



ㄴ 출력화면.



 2번 문제.


앞서 작성한 사각형의 테두리를 3픽셀의 붉은색으로 하고 내부는 회색으로 칠하시오.


void CEXGDIView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.



LOGBRUSH lb;
lb.lbStyle = BS_SOLID;
lb.lbColor = RGB(192,0,0);

CPen NewPen;
NewPen.CreatePen(PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_FLAT |PS_JOIN_MITER, 3, &lb);          
//선 속성 설정, 굵기 3의 색은 빨간색인 실선, 끝부분 처리는 뾰족함.
CPen* pOldPen = dc.SelectObject(&NewPen);

CBrush NewBrush(RGB(192,192,192));
CBrush* pOldBrush = dc.SelectObject(&NewBrush);

dc.Rectangle(20,20,140,140); //사각형을 그리는 함수


dc.SelectObject(pOldPen); //  펜속성 초기화
dc.SelectObject(pOldBrush); // 브러쉬 속성 초기화

}
 
그대로 지정해주면 됩니다. 팬 속성도 정해주고 브러쉬도 정해주고

마지막에 초기화까지 해주면 끝.



 


                                          ㄴ 출력화면.

 3번 문제. 

 임의의 육각형을 그려라..

이건 선긋기 + 랜더링 을 이용하면 됩니다.

 


void CEXGDIView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.

LOGBRUSH lb;
lb.lbStyle = BS_SOLID;
lb.lbColor = RGB(192,0,0);

CPen NewPen;
NewPen.CreatePen(PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_FLAT |PS_JOIN_MITER, 3, &lb);          
//선 속성 설정, 굵기 3의 색은 빨간색인 실선, 끝부분 처리는 뾰족함.
CPen* pOldPen = dc.SelectObject(&NewPen);

CBrush NewBrush(RGB(192,192,192));
CBrush* pOldBrush = dc.SelectObject(&NewBrush);


dc.BeginPath(); //경로 시작 [추가코드]
dc.MoveTo(50,0);
dc.LineTo(150,0);
dc.LineTo(195,85);
dc.LineTo(150,170);
dc.LineTo(50,170);
dc.LineTo(0,85);
dc.LineTo(50,0); //두께가 20 픽셀인 선을 세번 그어 삼각형을 그린다.
dc.EndPath(); //경로 종료 [추가코드]
dc.StrokeAndFillPath(); //두 함수를 통하여 완성된 폐곡선을 통한 도형을 랜더링[추가코드]


dc.SelectObject(pOldPen); //  펜속성 초기화
dc.SelectObject(pOldBrush); // 브러쉬 속성 초기화

}

moveto 와 lineto  를 이용하여 도형을 그리고 시작과 끝을 beginpath 와 endpath로 묶고 마지막에 랜더링함수 사용.

다각형의 그림을 그릴때 씁니다.




  4번 문제. 
 

사각형을 그리되 모서리부분을 둥글게 코드를 짜고 RoundRect() 함수를 사용하지 않고 코딩하라.

실은 완벽하게 풀진 못했습니다만. 보기에는 얼추 해낸듯한 코드를 보여드립니다.



void CEXGDIView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.


CRect PieRect(50,50,70,70);
dc.Rectangle(50,50,150,150); //사각형을 그리는 함수

dc.Pie(PieRect,CPoint(PieRect.CenterPoint().x,PieRect.top),CPoint(PieRect.left, PieRect.CenterPoint().y)); //내각이 90도인 부채꼴



CPen NewPen(PS_SOLID, 2, RGB(250,250,250));
CPen* pOldPen = dc.SelectObject(&NewPen);


dc.MoveTo(50,50);//시작 좌표
dc.LineTo(50,57);// 끝 좌표
dc.MoveTo(50,50);//시작 좌표
dc.LineTo(57,50);// 끝 좌표

dc.MoveTo(51,60);//시작 좌표
dc.LineTo(60,60);// 끝 좌표
dc.MoveTo(60,51);//시작 좌표
dc.LineTo(60,60);// 끝 좌표
//왼쪽 위 좌표

dc.SelectObject(pOldPen);  


 

마지막으로 전체 파일 업로드.