140 likes | 376 Views
Windows Graphic. 하드웨어 독립적 프로그래밍 디바이스 드라이버에 의한 하드웨어 독립적 프로그래밍. 응용 프로그램. GDI (Graphic Device Interface). 원도우 운영체제. 하드웨어 독립. 하드웨어 종속. 디바이스 드라이버. 디바이스 ( 그래픽 카드 , 프린터 ). 삼성. HP. ATI. Windows Graphic. 그래픽 예제 : Window 에 선을 하나 그리는 예제 선의 색깔 , 굵기 , 종류 지정해야 됨
E N D
Windows Graphic • 하드웨어 독립적 프로그래밍 • 디바이스 드라이버에 의한 하드웨어 독립적 프로그래밍 응용 프로그램 GDI (Graphic Device Interface) 원도우 운영체제 하드웨어 독립 하드웨어 종속 디바이스 드라이버 디바이스 (그래픽 카드, 프린터) 삼성 HP ATI
Windows Graphic • 그래픽 예제 : Window에 선을 하나 그리는 예제 • 선의 색깔, 굵기, 종류 지정해야 됨 • Device Context : 그래픽과 관련된 여러가지 성질 (선의 색깔, 굵기, 글자 폰트, …) 을 저장하는 구조체 • Device Context관련 class : CDC • 그래픽과 관련된 여러가지 성질 (멤버변수) + 실제로 그리는 함수 (멤버함수) CDC CPaintDC CClientDC Window의 client area의 그래픽 CMetaFileDC
CClientDC의 사용 • 사각형을 그리는 프로그램 예제 • this : 어떤 class의 자기자신을 가리키는 pointer • 질문 : 그려지는 사각형의 선의 굵기 및 색깔은? • 그래픽 옵션의 변경과 관련된 MFC class • CPen (선과 관련된 option) • CBrush (도형 내부를 칠하는 option 등) • CFont (글꼴) • CBitmap (나중에) • CPalette (나중에) • CRgn (나중에) CClientDC dc(this); dc.Rectangle(10,10,100,100); 원도우에서 device context를 할당 받음 멤버함수를 사용하여 사각형을 그림
CClientDC의 사용 • CPen을 사용한 선의 성질 선택 • Pen 스타일 • PS_SOLID • PS_DASH • PS_DOT • PS_DASHDOT • PS_DASHDOTDOT • PS_NULL • Pen 굵기 (단위 pixel ) : 3 pixel 굵기의 선을 그림 CPen pen; pen.CreatePen(PS_SOLID, 3, RGB(255,0,0) );
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)
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);
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);
CClientDC의 사용 • 내장 (Stock) Object의 사용 • SelectStockObject( WHITE_PEN or BLACK_PEN ) • stock object는 운영체제에 내장되어 있음으로 원래 것으로 돌려 놓을 필요가 없음. CClientDC dc(this); dc.SelectStockObject(WHITE_PEN); dc.Rectangle(10,10,100,100); CPen pen; pen.CreatePen(PS_SOLID, 3, RGB(255,255,255) ); CClientDC dc(this); CPen *pOldPen = dc.SelectObject(&pen); dc.Rectangle(10,10,100,100); dc.SelectObject(pOldPen);
CClientDC의 사용 • CClientDC에서 Pen과 Brush를 사용하는 멤버함수 • CPointMoveTo(intx,inty); CPointMoveTo(POINTpoint); 중 하나의 형식으로 사용 • BOOL Ellipse( int x1, int y1, int x2, int y2 ); 타원을 그림
CString class • CString Class : 문자열에 관한 MFC class • 윈도우 화면에 변수값을 출력하는 routine 예제 void CLecture72View::OnDraw(CDC* pDC) { CString text; int a = 5; text.format(“value is %d”,a); pDC->TextOut(100,100,text); }
연습문제 • 빨간색 사각형을 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; }
연습문제 • 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); }
연습문제 • 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); }
연습문제 • 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); }