1 / 55

윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다 .

윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다. GDI 와 디바이스 컨텍스트 (1/5). 출력 시스템을 설계할 때 고려할 사항 모니터 , 비디오 카드 , 프린터 등 출력에 사용되는 주변 장치가 변경되는 경우에도 프로그램을 수정할 필요가 없어야 한다 .

lyris
Download Presentation

윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다 .

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 윈도우의 화면 출력 원리를 이해한다. CDC 클래스를 이용한 화면 출력 기법을 배운다. 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다.

  2. GDI와 디바이스 컨텍스트 (1/5) • 출력 시스템을 설계할 때 고려할 사항 • 모니터, 비디오 카드, 프린터 등 출력에 사용되는 주변 장치가 변경되는 경우에도 프로그램을 수정할 필요가 없어야 한다. • 여러 프로그램이 화면을 분할해서 사용하므로 하나의 프로그램이 출력을 하는데 있어서 제약을 가해야 한다. 즉 화면이나 기타 출력 장치를 직접 접근(Direct Access)하거나 독점해서 사용하는 것을 운영체제 차원에서 막아야 한다.

  3. GDI(Graphic Device Interface) • 다수의 창이 하나의 화면을 공유

  4. GDI와 디바이스 컨텍스트 (2/5) • GDI(Graphics Device Interface) • 운영체제의 하위 시스템 중 하나로서 DLL로 존재 • 윈도우에서 화면에 점, 선, 사각형, 다각형, 원, 비트맵, 텍스트 등을 출력하는 모든 것들을 담당함 • 이 일을 담당하는 클래스가 CDC 클래스임 응용 프로그램 GDI 출력 장치 (화면, 프린터 등) 장치 독립적 장치 의존적

  5. GDI와 디바이스 컨텍스트 (3/5) • 화면 출력할 때 고려할 사항 • 클라이언트 영역에 출력하려면 화면에 해당하는 윈도우 위치를 알아야 한다. • 화면에 여러 개의 윈도우가 있을 때 출력 결과가 다른 윈도우의 영역을 침범하지 않아야 한다. • 현재 출력할 화면이 다른 윈도우에 가려졌다면 출력을 할 수 없어야 한다.

  6. GDI와 디바이스 컨텍스트 (4/5) • 디바이스 컨텍스트(DC, Device Context) • GDI가 생성하고 관리하는 데이터 구조체 • 멀티태스킹(멀티스레딩) GUI 환경에서 발생할 수 있는 여러 상황을 고려한 출력 가능 • 선, 문자, 그림등을 화면으로 입력 또는 출력함 • 프린터에 출력함

  7. 무효 영역 (1/3) • 화면을 다시 그려야 하는 상황

  8. 무효 영역 (2/3) • WM_PAINT에서 무효영역 처리함 • WM_PAINT 메시지 처리 • HelloSDK • HelloMFC case WM_PAINT: hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 100, 100, str, lstrlen(str)); EndPaint(hwnd, &ps); return 0; void CMainFrame::OnPaint() { char *msg = "Hello, MFC"; CPaintDC dc(this); dc.TextOut(100, 100, msg, lstrlen(msg)); }

  9. 무효 영역 (3/3) • WM_PAINT 메시지 발생 상황 • 윈도우가 생성될 때 • 윈도우의 크기가 변경될 때 • 최소화 또는 최대화 되었을 때 • 다른 윈도우가 가렸다가 드러날 때 • 무효 영역 생성 void CWnd::Invalidate (BOOL bErase = TRUE); void CWnd::InvalidateRect (LPCRECT lpRect, BOOL bErase = TRUE);

  10. 다양한 디바이스 컨텍스트 클래스 클래스 이름 용도 CPaintDC 클라이언트 영역에 출력할 때 (WM_PAINT 메시지 핸들러에서만 사용) CClientDC 클라이언트 영역에 출력할 때 (WM_PAINT 메시지 핸들러를 제외한 다른 모든 곳에서 사용) CWindowDC 윈도우의 전체 영역(클라이언트 영역 + 비 클라이언트 영역)에 출력할 때 CMetaFileDC 메타 파일(Metafile)에 출력할 때

  11. CPaintDC 클래스 • 클래스 계층도 • CPaintDC 사용 예 void CChildView::OnPaint() { CPaintDC dc(this); // ... }

  12. CClientDC 클래스 • CClientDC 사용 예 void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); // ... }

  13. CWindowDC 클래스 (0, 0) CWindowDC (0, 0) CPaintDC, CClientDC • CWindowDC 사용 방법 • CPaintDC, CClientDC 클래스와 동일 • 원점 위치

  14. CMetaFileDC 클래스 • 메타 파일(Metafile) • GDI 명령어를 저장할 수 있는 파일 • CMetaFileDC 사용 방법 • CMetaFileDC 객체를 만든 후 CMetaFileDC::Create() 호출 • 메타 파일 객체를 일반적인 디바이스 컨텍스트 객체로 간주하고 출력 관련 멤버 함수를 호출 • CMetaFileDC::Close()를 호출하면 윈도우 운영체제가 내부적으로 메타 파일을 만든 후 메타 파일 핸들(HMETAFILE 타입)을 리턴 • CDC::PlayMetaFile()로 메타 파일을 실행

  15. 그리기 함수 (1/3) 이름 기능 GetPixel() 화면의 특정 위치에 해당하는 점의 색을 얻는다. SetPixel() 화면의 특정 위치에 원하는 색의 점을 찍으며 원래의 점의 색을 리턴한다. SetPixelV() SetPixel과 기능은 동일하지만 SetPixel 함수와 달리 원래의 점의 색을 리턴하지 않으므로 속도가 더 빠르다. • 점 찍기 • SetPixel(x좌표값, y좌표값, RGB값) : 화면의 특정위치에 원하는 색의 점을 찍으며, 원래 점의색을 리턴함

  16. CDC 클래스의 그래픽 관련 함수들 • 도형그리기 • Rectangle • Ellipse • Arc • 문자출력함수 • TextOut • DrawText

  17. 그리기 함수 (1/3) 이름 기능 MoveTo() 현재 위치를 옮긴다. LineTo() 현재 위치로부터 특정 위치까지 선을 그린 후 현재 위치를 갱신한다. • 선 그리기 • MoveTo(x위치값, y 위치값) : x,y 위치로 현재위치를 옮긴다. • LineTo(x위치값, y 위치값) : 항상 클라이언트 영역의 0,0 • 위치를 기준으로 한다. 기준위치를 옮기려면 MoveTo • 이용해야 한다.

  18. 그리기 함수 (2/3) • 선그리기 • (예를 들어서 (x1, y1) –(x2,y2)를 잇는 선을 그린다고 과정한다) 1. 현재 위치를 (x1, y1)으로 옮긴다.  MoveTo()함수 이용 dc.MoveTo(x1, y1); 2. 현재 위치에서 (x2, y2)까지 선을 그린다.  LineTo()함수 이용 dc.LineTo(x2, y2); 예) (10,10)에서 (200,200) 을 잇는 선을 그린다. CPaintDC dc(this); dc. MoveTo(10,10); dc.LineTo(200,200);

  19. 그리기 함수 (3/3) 이름 기능 Rectangle() 사각형을 그린다. Ellipse() 사각형에 내접하는 타원을 그린다. • 도형 그리기 • Rectangle(x, y, width, height) : 왼쪽 상단의 x,y 지점에서 폭 • 이 width, 높이가 height인 사각형 그림 • Ellipse(x, y, width, height) : 사각형을 그린 후, 그 안에 원을 • 그리는 형태로 타원을 그림.

  20. 텍스트 함수 이름 기능 TextOut() 특정 위치에 문자열을 출력한다. DrawText() 사각형을 기준으로 문자열을 출력한다. SetTextColor() 문자의 색을 바꾼다. SetBkColor() 문자의 배경색을 바꾼다. SetTextAlign() 기준 위치에 대한 문자열의 정렬 방식을 정한다. • 텍스트 출력 함수

  21. 텍스트 함수 • TextOut 함수 • 지정된 위치에 문자열을 출력하는 함수임 • 함수원형 • BOOL TextOut (x좌표값, y좌표값, 문자열, 문자열길이); • 예제 CClientDC dc(this); dc.TextOut(10,10, “안녕하세요”);  10, 10 위치에 “안녕하세요” 문자열 출력

  22. 텍스트 함수 • DrawText 함수 • 지정된 사각형안에 문자열을 출력하는 함수임 • 함수원형 • int DrawText (문자열,LPRECT lprect, UINT nFormat); • lprect : 출력할 사각 영역 • nFormat : 출력 형식 플러그 • 예제 CClientDC dc(this); CRect rect; GetClientRect(&rect); dc.DrawText(“사각형에출력”, &rect,DT_CENTER);  지정된 사각형안에 문자열 출력

  23. 텍스트 함수

  24. 텍스트 함수 • SetTextColor 함수 • 배경색은 그대로 두고 텍스트의 전경색을 설정함 • 함수원형 COLORREF SetTextColor(COLORREF crColor ); • 예제 CClientDC dc(this); dc.SetTextColor(RGB(100,200,300)); //초록색 지정 dc.TextOut(10,10, “안녕하세요”); • SetBkColor 함수 • 텍스트의 배경색을 설정함 • 함수원형 COLORREF SetBkColor(COLORREF crColor ); • 예제 CClientDC dc(this); dc.SetBkColor(RGB(255,255,0)); //노란색 지정

  25. 텍스트 함수 • SetTextAlign 함수 • 기준위치에 대한 텍스트의 정렬방법을 설정함 • 함수원형 UINT SetTextAlign(UINTfMode); • fMode // 텍스트 정렬 모드 • TA_TOP : 지정한 좌표가 상단 좌표가 된다. • TA_BOTTOM : 지정한 좌표가 하단 좌표가 된다. • TA_CENTER : 지정한 좌표가수평 중앙좌표가 된다. • TA_LEFT : 지정한 좌표가수평 왼쪽좌표가 된다.(기본) • TA_RIGHT : 지정한 좌표가수평 오른쪽좌표가 된다. • TA_UPDATECP : 지정한 좌표대신 CP를 사용하며 문자열 출력 후에 CP를 변경한다. • TA_NOUPDATECP : CP를 사용하지 않고 지정한 좌표를 사용하며 CP를 변경하지 않는다.

  26. 텍스트 함수 • SetTextAlign 함수 • 예제 dc.TextOut(70,0,"Hello World!"); dc.SetTextAlign(TA_CENTER); dc.TextOut(70,20,"Hello World!");  70,20이 중심점 dc.SetTextAlign(TA_RIGHT); dc.TextOut(70,40,"Hello World!");

  27. GDI 객체 (1/3) GDI 객체 용도 클래스 이름 펜 선을 그릴 때 CPen 브러시 면의 내부를 채울 때 CBrush 폰트 문자를 출력할 때 CFont 비트맵 픽셀의 집합으로 이루어진 그림을 다룰 때 CBitmap 팔레트 출력될 색의 집합을 다룰 때 CPalette 영역 다양한 형태의 면을 정의할 때 CRgn • GDI 객체 • GDI에서 출력할 때 사용하는 도구 • 종류

  28. GDI 객체 (2/3) 브러시 객체 폐다각형의 내부담당 DC객체가 그래픽 처리시 사용하는 자원들 연필 객체 그림의 선 부분 담당 • 클래스 계층도

  29. GDI를 통한 출력 절차 3 DC객체생성 Brush생성 등록 2 1 사용 후…. DC객체소멸 Brush소멸 5 4

  30. GDI 객체 (3/3) • GDI 객체 사용 방법 • GDI 객체를 스택에 생성한다. • 생성된 GDI 객체를 디바이스 컨텍스트에 선택하고 이전에 선택되어 있던 같은 종류의 GDI 객체의 주소를 저장해둔다(CDC::SelectObject() 사용). • GDI 함수를 사용하여 출력을 한다. • 이전의 GDI 객체를 디바이스 컨텍스트에 선택함으로써 기존에 선택된 GDI 객체를 선택 해제한다(CDC::SelectObject() 사용). • GDI 객체가 범위(Scope)를 벗어나면 소멸자가 자동으로 호출되면서 파괴된다.

  31. 펜 (1/2) • 생성 방법 • 펜 스타일 // 방법 1 CPen pen(PS_SOLID, 2, RGB(255, 0, 0)); // 방법2 CPen pen; pen.CreatePen (PS_SOLID, 2, RGB (255, 0, 0));

  32. 펜 (2/2) • 사용 예 1 • 사용 예 2 CPaintDC dc(this); CPen pen(PS_SOLID, 1, RGB(0, 0, 255)); CPen *pOldPen = dc.SelectObject(&pen); dc.Rectangle(100, 100, 200, 200); dc.SelectObject(pOldPen); //펜객체 생성 //이전 객체의 상태를 저장하면서 새로 생성된 펜 객체 선택함. //도형그림 //이전 객체를 선택함 CPaintDC dc(this); CPen pen(PS_SOLID, 1, RGB(0, 0, 255)); dc.SelectObject(&pen); dc.Rectangle(100, 100, 200, 200); //펜객체 생성 //생성한 펜을 객체로 선택함 //도형을 그림

  33. 브러시 (1/2) 브러시 종류 생성 예 솔리드(Solid, 속이 채워짐) CBrush brush(RGB(255, 0, 0)); 해치(Hatch, 교차된 평행선 무늬) CBrush brush(HS_DIAGCROSS, RGB(255, 0, 0)); 패턴(Pattern, 비트맵의 반복 무늬) CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); CBrush brush(&bitmap); • 도형의 내부를 지정한 색상 및 무늬로 채운다. • 종류

  34. 브러시 (1/2) • 해치브러시 스타일 CBrush brush(HS_DIAGCROSS, RGB(255, 0, 0));

  35. 브러시 (2/2) • 사용 예 1 • 사용 예 2 CPaintDC dc(this); CBrush brush(RGB(255, 0, 0)); CBrush *pOldBrush = dc.SelectObject(&brush); dc.Ellipse(100, 100, 200, 200); dc.SelectObject(pOldBrush); //DC객체 생성 //브러시객체 생성 //객체 등록 + // 이전 객체 저장 //도형 그림 //이전 객체 등록 CPaintDC dc(this); CBrush brush(RGB(255, 0, 0)); dc.SelectObject(&brush); dc.Ellipse(100, 100, 200, 200); //DC객체 생성 //DC객체 생성 //생성한 객체 등록 //도형그림

  36. 브러시 • LOGBRUSH 구조체 원형 typedef struct tagLOGBRUSH { UINT lbStyle; //브러시 스타일 정의 COLORREF lbColor; //색상 정의 LONG lbHatch; //무늬 정의 } LOGBRUSH;

  37. 브러시 • LOGBRUSH 구조체 사용예제 CClientDC dc(this); //DC 객체 생성 LOGBRUSH logbrush; // LOGBRUSH 구조체 변수 선언 //브러시의 내용을 정의 logbrush.lbColor = RGB(255,0,255); //색상 설정 logbrush.lbStyle = BS_HATCHED; //무늬가 있는 붓 설정 logbrush.lbHatch = HS_CROSS; //십자가 무늬 설정 CBrush objectBrush; //브러시 객체 생성 objectBrush.CreateBrushIndirect(&logbrush); //브러시의 내용을 LOGBRUSH 통해서 간접 참조 dc.SelectObject(&br); //브러시 객체 등록 dc.Ellipse(point.x, point.y, point.x+50,point.y+50);

  38. 브러시 • CBrush:: CreateBrushIndirect 함수 설명 BOOL CBrush:: CreateBrushIndirect ( const LOGBRUSH* lpLogBrush ); • - LOGBRUSH 구조체에 설정되어 있는 브러시의 내용을 • 선택하는 함수임 • 예 CBrush objectBrush; //브러시 객체 생성 objectBrush.CreateBrushIndirect(&logbrush); //브러시의 내용을 LOGBRUSH 통해서 간접 참조

  39. 브러시 –비트맵으로 면 채우기 CBitmap bitmap; //CBitmap 클래스의 객체 선언 bitmap.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1 그림을 메모리에 로드 CBrush br(&bitmap); //면을 그림으로 채워라 dc.SelectObject(&br); //생성한 브러시객체 등록 dc.Ellipse(point.x, point.y, point.x+50,point.y+50);

  40. 폰트 • 생성 방법 • CFont 객체 생성 • CFont 객체에 대해 Create*() 함수를 호출 CFont font; font.CreateFont(...); // font.CreateFontIndirect(...); // font.CreatePointFont(...); // font.CreatePointFontIndirect(...);

  41. 폰트 • LOGFONT 구조체 typedef struct tagLOGFONT { // lf LONG lfHeight; // 높이LONG lfWidth; // 폭LONG lfEscapement;// 기울기 10도를 기울이게 하려면 100을 넣는다. LONG lfOrientation; // 한문자당 기울기LONG lfWeight;// 굵기 (일반 : 400 FW_NORMAL, BOLD : 700 FW_BOLD 정도) BYTE lfItalic; // Italic BYTE lfUnderline; // 밑줄 (TRUE) BYTE lfStrikeOut; // 취소선 (TRUE) BYTE lfCharSet;// 문자셋 (영문만 , 0, 한글도 하려면 1 ) BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; // 글꼴} LOGFONT;

  42. 폰트 • CreateFontIndirect :LOGFONT 구조체에 지정된 특성으로 CFont 객체를 초기화한다. • CreateFont : 주어진 속성을 이용하여 CFont 객체를 초기화한다. • CreatePointFont : 포인트의 1/10의 크기를 단위로 하여, 지정된 높이를 갖는 CFont 객체를 초기화한다. • CreatePointFontIndirect: 논리 단위가 아닌 포인트의 1/10의 크기를 단위로 했다는 점만 빼고 CreateFontIndirect함수와 거의 동일하다.

  43. 폰트 • 사용 예 CPaintDC dc(this); CFont font; font.CreatePointFont(400, "Arial"); dc.SelectObject(&font); dc.TextOut(10, 10, CString("Hello"));

  44. 내장 객체 이름 용도 BLACK_PEN 폭이 1 픽셀인 검정색 펜 WHITE_PEN 폭이 1 픽셀인 흰색 펜 NULL_PEN 투명 펜 BLACK_BRUSH 검정색 브러시 DKGRAY_BRUSH 어두운 회색 브러시 GRAY_BRUSH 회색 브러시 LTGRAY_BRUSH 밝은 회색 브러시 HOLLOW_BRUSH 또는 NULL_BRUSH 투명 브러시 SYSTEM_FONT 윈도우 운영체제가 사용하는 폰트 예) 메뉴, 대화상자, ... • CDC::SelectStockObject() 함수를 사용하여 디바이스 컨텍스트에 선택한다.

  45. 비트맵 (1/5) 구조체를 통해서 비트맵의 정보를 가져온다. • 비트맵 정보 int CBitmap::GetBitmap (BITMAP* pBitMap) ; 비트맵의 정보가 담긴 구조체 typedef struct tagBITMAP { int bmType; int bmWidth; // 비트맵의 폭(픽셀 단위) int bmHeight; // 비트맵의 높이(픽셀 단위) int bmWidthBytes; BYTE bmPlanes; BYTE bmBitsPixel; LPVOID bmBits; } BITMAP;

  46. 비트맵 (2/5) • 비트맵 정보 출력 CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); BITMAP bmpinfo; bitmap.GetBitmap(&bmpinfo) CString str; Str.Format("가로 = %d, 세로 = %d\n", bmpinfo.bmWidth, bmpinfo.bmHeight); dc.TextOut(10,10,str);

  47. 비트맵 (3/5) • 비트맵 출력에 사용되는 함수 • CDC::CreateCompatibleDC() • 메모리 디바이스 컨텍스트를 만든다. • 그래픽 출력에 이용할 메모리 생성. 정확하게는 DC 장치와 같은 기능을 하는 메모리 DC를 생성 하는 것임 • 함수 원형 BOOL CreateCompatibleDC( CDC* pDC );

  48. 비트맵 (4/5) • 비트맵 출력에 사용되는 함수 • CDC::BitBlt() • 비트맵을 원본의 크기와 같은 크기로 화면에 출력한다. • CDC::StretchBlt() • 비트맵을 원본의 크기와 다른 크기로 화면에 출력할때 사용한다.

  49. 비트맵 (4/5) pSrcDC (메모리 디바이스 컨텍스트) ySrc xSrc (스크린 디바이스 컨텍스트) y nWidth x nHeight • 비트맵 출력 함수 BOOL BitBlt (int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop) ;

  50. 비트맵 (5/5) • 비트맵 출력 함수 (cont'd) BOOL StretchBlt (int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop) ; 크기변경 출력가능함 pSrcDC (메모리 디바이스 컨텍스트) ySrc nSrcWidth xSrc nSrcHeight (스크린 디바이스 컨텍스트) y nWidth x nHeight

More Related