CClientDC의 사용

Download Report

Transcript CClientDC의 사용

Windows Graphic
 하드웨어 독립적 프로그래밍
• 디바이스 드라이버에 의한 하드웨어 독립적 프로그래밍
응용 프로그램
원도우 운영체제
GDI (Graphic
Device Interface)
하드웨어 독립
하드웨어 종속
디바이스 드라이버
디바이스 (그래픽 카드, 프린터)
삼성
프로그래밍 응용 #8
HP
ATI
1
Windows Graphic
 그래픽 예제 : Window에 선을 하나 그리는 예제
• 선의 색깔, 굵기, 종류 지정해야 됨
 Device Context : 그래픽과 관련된 여러가지 성질 (선의 색깔, 굵기, 글자 폰트, …) 을 저장하
는 구조체
 Device Context관련 class : CDC
• 그래픽과 관련된 여러가지 성질 (멤버변수) + 실제로 그리는 함수 (멤버함수)
CDC
CPaintDC
CClientDC
Window의 client area의 그래픽
CMetaFileDC
프로그래밍 응용 #8
2
CClientDC의 사용
 사각형을 그리는 프로그램 예제
• this : 어떤 class의 자기자신을 가리키는 pointer
•
CClientDC dc(this);
원도우에서 device context를 할당 받음
dc.Rectangle(10,10,100,100);
멤버함수를 사용하여 사각형을 그림
질문 : 그려지는 사각형의 선의 굵기 및 색깔은?
 그래픽 옵션의 변경과 관련된 MFC class
• CPen (선과 관련된 option)
• CBrush (도형 내부를 칠하는 option 등)
• CFont (글꼴)
• CBitmap (나중에)
• CPalette (나중에)
• CRgn (나중에)
프로그래밍 응용 #8
3
CClientDC의 사용
 CPen을 사용한 선의 성질 선택
CPen pen;
pen.CreatePen(PS_SOLID, 3, RGB(255,0,0) );
 Pen 스타일
• PS_SOLID
• PS_DASH
• PS_DOT
• PS_DASHDOT
• PS_DASHDOTDOT
• PS_NULL
 Pen 굵기 (단위 pixel ) : 3 pixel 굵기의 선을 그림
프로그래밍 응용 #8
4
CClientDC의 사용
 Pen 색깔 : RGB 색깔 (0 – 255 사이의 숫자로 지정)
• 빨간색 RGB(255, 0, 0)
• 녹색 RGB(0,255,0)
• 파란색 RGB(0,0,255)
• 노랑색 RGB(255,255,0)
• 흰색 RGB(255,255,255)
• 검정색 RGB(0,0,0)
• ???색 RGB(123,130,67)
프로그래밍 응용 #8
5
CClientDC의 사용
 SelectObject를 사용하여 DC에 CPen 추가
• Device Context는 Windows에서 빌려 사용하는 것임
• 현재의 graphic option을 보관하였다가 나중에 원상 복귀함
CPen pen;
pen.CreatePen(PS_SOLID, 3, RGB(255,0,0) );
CClientDC dc(this);
CPen *pOldPen = dc.SelectObject(&pen);
dc.Rectangle(10,10,100,100);
dc.SelectObject(pOldPen);
프로그래밍 응용 #8
6
CClientDC의 사용
 CPen의 사용 : option을 중간에 바꿈
CPen pen;
pen.CreatePen(PS_SOLID, 3, RGB(255,0,0) );
CClientDC dc(this);
CPen *pOldPen = dc.SelectObject(&pen);
dc.Rectangle(10,10,100,100);
pen.DeleteObject();
pen.CreatePen(PS_SOLID, 3, RGB(255,255,0) );
dc.SelectObject(&pen);
dc.Rectangle(200,200,300,300);
dc.SelectObject(pOldPen);
프로그래밍 응용 #8
7
CClientDC의 사용
 내장 (Stock) Object의 사용
• SelectStockObject( WHITE_PEN or BLACK_PEN )
CClientDC dc(this);
dc.SelectStockObject(WHITE_PEN);
CPen pen;
pen.CreatePen(PS_SOLID, 3, RGB(255,255,255) );
dc.Rectangle(10,10,100,100);
CClientDC dc(this);
CPen *pOldPen = dc.SelectObject(&pen);
dc.Rectangle(10,10,100,100);
dc.SelectObject(pOldPen);
• stock object는 운영체제에 내장되어 있음으로 원래 것으로 돌려 놓을 필요가
없음.
프로그래밍 응용 #8
8
CClientDC의 사용
 CClientDC에서 Pen과 Brush를 사용하는 멤버함수
•
•
함수
그리기 기능
MoveTo, LineTo
선
Rectangle, FillRect, FrameRect, Draw3dRect
사각형
Ellipse
타원
Pie
파이
Arc, ArcTo, AngleArc, Chord
호
Polygon
다각형
PolyDraw, PolyBezier, PolyBezierTo
베지어 곡선
FrameRgn
영역의 경계선
CPoint MoveTo( int x, int y ); CPoint MoveTo( POINT point ); 중 하나의 형식으로 사용
BOOL Ellipse( int x1, int y1, int x2, int y2 ); 타원을 그림
프로그래밍 응용 #8
9
CString class
 CString Class : 문자열에 관한 MFC class
void CLecture72View::OnDraw(CDC* pDC) {
CString text;
int a = 5;
text.format(“value is %d”,a);
pDC->TextOut(100,100,text);
}
• 윈도우 화면에 변수값을 출력하는 routine 예제
프로그래밍 응용 #8
10
연습문제
 빨간색 사각형을 1개 그리고, 마우스의 cursor가 이 마우스 안으로 들어가면 파란색 사각형
으로 변하고, 빠져 나오면 다시 빨간색으로 변하는 프로그램을 작성하라.
• my_color = 0 : 빨간색 사각형 , my_color = 1: 파란색 사각형
• CView class의 생성자가 call 됨
• Windows가 처음 생기면
int my_color;
CPoint s, e;
CLecture72View::CLecture72View()
{
// TODO: add construction code here
my_color = 0;
s.x = 100;
s.y = 100;
e.x = 200;
e.y = 200;
}
프로그래밍 응용 #8
11
연습문제
 OnDraw 함수
• my_color의 값에 따라서 사각형을 그림
• 실제로 사각형은 draw_rect에서 그림
void CLecture72View::OnDraw(CDC* pDC)
{
CLecture72Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if ( my_color == 0 )
draw_rect(s,e, 255, 0, 0);
else
draw_rect(s,e,0,0,255);
}
프로그래밍 응용 #8
12
연습문제
 draw_rect 함수
void CLecture72View::draw_rect(CPoint start, CPoint end, BYTE red, BYTE green,
BYTE blue)
{
CPen pen;
pen.CreatePen(PS_SOLID, 2, RGB(red,green,blue) );
CClientDC dc(this);
CPen *pOldPen = dc.SelectObject(&pen);
dc.Rectangle(start.x, start.y, end.x, end.y);
dc.SelectObject(pOldPen);
}
프로그래밍 응용 #8
13
연습문제
 OnMouseMove : mouse가 사각형 안에 있는지 판단
void CLecture72View::OnMouseMove(UINT nFlags, CPoint point)
{
if ( (point.x > s.x) && (point.y > s.y) && (point.x < e.x) && (point.y < e.y) ) {
if ( my_color == 0) {
my_color = 1;
Invalidate();
}
}
else {
if ( my_color == 1) {
my_color = 0;
Invalidate();
}
}
CView::OnMouseMove(nFlags, point);
}
프로그래밍 응용 #8
14