Windows Programming 제대로 배우기 - PowerPoint PPT Presentation

windows programming n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Windows Programming 제대로 배우기 PowerPoint Presentation
Download Presentation
Windows Programming 제대로 배우기

play fullscreen
1 / 37
Windows Programming 제대로 배우기
188 Views
Download Presentation
gareth
Download Presentation

Windows Programming 제대로 배우기

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Windows Programming제대로 배우기 Chapter 5. Basic Drawing

  2. 학습 목표 목표 화면에 글자 및 선,박스,원, 다각형을 출력하는 방법에 대해서 설명 학습 단계 • 윈도우 GUI환경의 기본 개념을 이해 • 텍스트를 출력하는 여러 방법 학습 • DC(Device Context)를 얻는 방법 학습 • 선,박스,원,다각형을 출력하는 방법 학습

  3. GDI(Graphics Device Interface)의 개념 hwnd=CreateWindow(….); TextOut(hwnd,글자를 출력하는 옵션); HWND는 하나의 윈도우의 여러 정보를 가지는 구조체 HDC는 HWND와 연결되어있는 화면을 위한 구조 윈도우에서 GDI • GDI란 Graphics Device Interface의 약자 • 윈도우는 단지 그 디바이스드라이버를 로드하여 화면 출력은 디바이스드라이버에 의존 • 윈도우 시스템은 현재 화면의 전체 크기는 어떻게 출력되는가와 현재 화면에 출력되는 칼라수가 어떤 것이라는 정보를 디바이스 드라이버를 통해서 얻고 또한 디바이스 드라이버에 설정해 주는 역할 • 윈도우 시스템은 디바이스 드라이버와 서로 인터페이스

  4. GDC (Graphics Device Context) GDC(Graphic Device Context) • 각 윈도우의 화면과 모니터 화면과는 별개 • 각 윈도우 화면이 모니터에 다 나타나지 않을 수도 있다 • 각 윈도우마다 해당되는 화면이 따로 존재하고 이것은 화면에 나타나지 않아도 어느 메모리를 점유하며 존재한다는 것을 의미 • 각 윈도우는 각 윈도우에 해당하는 메모리가 있고 이것을 윈도우 시스템에서는 조화있게 화면에 출력하는 기능 • 프로그램을 작성할 경우에는 단순히 현재 윈도우와 연결되어 있는 HDC를 이용하여 글자를 기록하고 도형을 기록하지만 그것은 모니터 화면에 기록하는 것이 아니라 윈도우와 연결되어 있는 화면 메모리에 기록을 하는 것임

  5. GDC (Graphics Device Context) 그림 그리는 단계 • 윈도우가 만들어지면 시스템에서는 그 윈도우의 화면 메모리 영역을 할당 • 그 화면에 메모리영역에서 모니터에 출력할 부분을 읽어다가 해당위치에 출력 • 이런 컨트롤을 하는 프로그램이 윈도우 시스템에 있는 "GDI32.DLL“ => 그래픽 디바이스 인터페이스를 모두 관장하는 프로그램 디바이스 컨텍스트 • 윈도우와 연결되어 있는 화면은 모니터 화면이 아니라는 것, 즉, 윈도우 시스템에서 설정한 화면 메모리라는 것이고 이 메모리를 컨트롤 하는 것이 바로 HDC라는 핸들 • 그래픽을 출력하고자 할 경우에는 HDC핸들을 얻어야 함 HDC • 디바이스 컨텍스 핸들 • 디바이스 컨텍스트라는 것은 바로 현재 윈도우와 연결된 화면 메모리 관리자

  6. HDC핸들 얻기 첫 번째 방법 * WM_PAINT hdc = BeginPaint (hwnd, &ps) ; EndPaint (hwnd, &ps) ; WM_PAINT라는 메시지 • 화면을 제출력할 필요가 있을 때 사용되는 메시지 • 이메시지와 함게 Beginpaint함수와 EndPaint함수는 쌍으로 호출되는 것이 기본 • 화면을 재출력하고자 할 경우 먼저 HDC를 받음 • BeginPaint함수의 첫 번째 인자는 윈도우 핸들러 HWND • 윈도우와 연계된 화면 출력 메모리 핸들러를 받아야 하기 때문에 필수적으로 넘겨주어야 함 • ps는 PAINTSTRUCT 구조체 • 윈도우의 실제 출력하는 화면 메모리의 영역에 대한 정보를 가지고 있음

  7. HDC핸들 얻기 첫 번째 방법 PAINTSTRUCT 구조체

  8. HDC핸들 얻기 첫 번째 방법 EndPaint (hwnd, &ps) HDC를 얻은 후에 이 HDC에 여러 그래픽 내용을 출력하면 화면에 출력. 이렇게 출력을 한 다음에 출력종료를 의미하는 함수 InvalidateRgn WM_PAINT 메세지는 외부에서도 호출할 수 있지만 내부에서도 호출가능 => 이것을 호출하는 방법은 이 함수 사용 BOOL InvalidateRgn( HWND hWnd, // 윈도우 핸들 HRGN hRgn, // 새로 출력할 화면 영역 BOOL bErase // 배경색을 다시칠하는 유무 플러그 ); HRGN 이 형은 바로 다시 출력할 화면의 영역을 정보를 가지고 있는 영역 핸들러

  9. HDC핸들 얻기 첫 번째 방법 InvalidateRgn WM_PAINT라는 메시지가 수행되고 그 안에 있는 내용들이 출력됨 WM_PAINT: 출력 데이터 변수를 화면에 출력: break; 다른 메시지 처리 루틴: 출력 데이터 변경 break;

  10. HDC핸들 얻기 첫 번째 방법 (예) char name[80]; char tel[80] WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; TextOut(0,0,name,strlen(name)); TextOut(0,10,name,strlen(tel)); EndPaint (hwnd, &ps) ; break; 다른 메시지 strcpy(name,"이상엽"); strcpy(tel,"이구팔-마구돌려"); InvalidateRgn(hwnd,NULL,TRUE); break;

  11. HDC핸들 얻기 두 번째 방법 - 윈도우에서도 필요할 때마다 HDC핸들러를 얻어서 화면 출력할 수가 있음 - 이 방법의 기본 형태 hdc=GetDC(hwnd); ReleaseDC(hwnd,hdc); (1) GetDC를 하게 되면 출력 디바이스 핸들러가 넘어오게 되고 이 DC를 이용하여 그래픽을 출력 (2) GetDC를 이용하면 일시적인 출력 (3) 만일 화면에 감추어져 있다가 나타나거나 프로그램 내에서 InvalidateRgn이라는 함수를 호출하게 되면 WM_PAINT가 호출되고 그리고 새로 화면을 출력하기 때문에 GetDC와 ReleaseDC를 이용하여 출력한 내용은 사라지게 됨 (4) 보통 GetDC와 ReleaseDC를 이용할때는 잠시 출력하는 데이터나 또는 DC의 정보를 얻기 위한 수단으로 많이 이용

  12. HDC핸들 얻기 두 번째 방법 (예) 화면의 가로 픽셀과 세로 픽셀의 수 픽셀당 비트수 칼라수등을 얻고자 할 경우 이때도 DC를 이용한 GetDeviceCaps라는 함수를 사용 int GetDeviceCaps( HDC hdc, //디바이스 컨텍스트 핸들 int nIndex //얻고자 하는 정보 번호 ); hdc=GetDC(hwnd); Dvnum=GetDeviceCaps(hdc,HORZRES );//전체화면 가로픽셀 Dvnum=GetDeviceCaps(hdc,VERTRES );//전체화면 세로 픽셀 Dvnum=GetDeviceCaps(hdc,BITSPIXEL );//픽셀당 비트수 Dvnum=GetDeviceCaps(hdc,NUMCOLORS );//사용하는 칼라수 ReleaseDC(hwnd,hdc);

  13. HDC핸들 얻기 세 번째 방법 1. 윈도우 핸들과함께 해당되는 DC를 얻었음 2. 필요에 따라서 DC만 따로 만들 필요가 있음 (1) 화면에 출력을 하지 않고 우선은 DC를 만들고 그안에 여러 정보를 출력한 다음 이것을 화면에 전송할 경우 (2) bmp파일을 읽어서 적당하게 처리한 다음 그것을 DC로 가지고 있다고 화면에 붙일 수도 있기 때문 => 윈도우와 연결되어 있지 않는 독립적인 DC를 얻는 함수는 CreateDC

  14. HDC핸들 얻기 세 번째 방법 HDC CreateDC( LPCTSTR lpszDriver, // 선택할 특정 드라이버 이름 LPCTSTR lpszDevice, // 선택할 특정 디바이스 이름 LPCTSTR lpszOutput, // 사용안함 NUL을 사용 CONST DEVMODE *lpInitData // 프린터 출력시 사용합니다. ); (예) hdc=CreateDC("DISPLAY",NULL,NULL,NULL); wsprintf(temp,"윈도우 전체 화면 DC를 얻어서 출력"); TextOut(hdc,0,0,temp,strlen(temp)); DeleteDC(hdc); CreateDC의 드라이버 이름을 "DISPLAY"라는 명을 사용하게 되면 전체 화면 DC를 얻게 됨. => 이 DC를 이용하여 여러 내용을 출력함

  15. 윈도우의 특정 HDC 얻기 클라이언트 영역의 DC WM_PAINT의 메시지후에 BeginPaint함수에 의해서 얻어진 DC 비클라이언트 영역을 포함한 전체 DC를 받고자 할 경우 윈도우는 실제 데이터를 출력하는 영역과 이 영역을 감싸고 있는 타이틀 바와 축소확대 버튼 종료 버튼 그리고 윈도우 경계선들이 있음 WM_PAINT에서 얻어진 DC는 타이틀 바와 경계선을 제외 결국 타이틀 바와 경계부분의 영역의 DC는 WM_PAINT로는 받을 수가 없음 => GetWindowDC

  16. 윈도우의 특정 HDC 얻기 hdc=GetWindowDC(hwnd); : ReleaseDC(hwnd,hdc); • GetWindowDC를 호출하게 되면 윈도우 외곽선을 포함한 모든 영역 즉 윈도우 전체 영역을 DC로 받을 수 있음 - 보통 외곽이 없는 프로그램을 작성하고자 할 경우 또는 특정형태의 윈도우(보통 타이틀 윈도우)일 경우에 이 DC를 간혹 이용하기도 함

  17. 텍스트 출력하기 기본적인 텍스트 출력 TextOut BOOL TextOut( HDC hdc, // 디바이스 컨텍스 핸들 int nXStart, // 문자 출력 시작점 x좌표 int nYStart, // 문자 출력 시작점 y좌표 LPCTSTR lpString, // 문자열 int cbString // 문자열의 길이 );

  18. 텍스트 출력하기 박스 영역에 출력 함수 DrawText int DrawText( HDC hdc, //디바이스 컨텍스트 핸들 LPCSTR lpString,//출력할 문자 int nLength, //출력할 문자의 수 LPRECT lpRect, //출력할 영역 UINT Flags);// 출력 형식 플러그 • uformat • 출력방법을 플래그를 가지고 설정 • DT_LEFT | DT_TOP • DT_CENTER | DT_TOP

  19. 텍스트 출력하기 박스 영역 및 좌표 설정 문자출력 ExtTextOut BOOL ExtTextOut( HDC hdc, // 디바이스 컨텍스 핸들 int X, // 출력 X좌표 int Y, //출력 Y좌표 UINT fuOptions, // 출력 옵션 CONST RECT *lprc, //출력 박스 영역 LPCTSTR lpString, // 출력 문자열 UINT cbCount, // 출력 문자 길이 CONST INT *lpDx // 문자열의 원점으로부터 출력 값의 배열 );

  20. 색 정의 구조체 COLORREF COLORREF co=RGB(255,0,0); 문자출력 색설정하기 SetTextColor COLORREF SetTextColor( HDC hdc, //디바이스 컨텍스트 핸들 COLORREF crColor //문자열 출력 칼라 );

  21. 선박스 도형 출력하기 라인 그리기 BOOL MoveToEx( HDC hdc, // 디바이스 컨텍스트 핸들 int X, // 새로운 위치의 x좌표 int Y, // 새로운 위치의 y자표 LPPOINT lpPoint // 이전 위치 좌표 ); typedef struct tagPOINT { // pt LONG x; LONG y; } POINT;

  22. 선박스 도형 출력하기 라인 그리기 BOOL LineTo( HDC hdc, // 디바이스 핸들 int nXEnd, // 그리는 좌표 종점 x int nYEnd // 그리는 좌표 종점 y );

  23. 선박스 도형 출력하기 박스 그리기 BOOL Rectangle( HDC hdc, // 디바이스 컨텍스트 핸들 int nLeftRect, // 좌측 x좌표 int nTopRect, // 상단 y좌표 int nRightRect, // 우측 x좌표 int nBottomRect //하단 y좌표 );

  24. Rect Operation Function • Rect(영역)을 사용하고 조작하는데 사용되는 유용한 함수 • OffsetRect : 주어진 Rect를 dx, dy만큼 이동 • InflateRect : 주어진 Rect를 dx, dy만큼 늘이거나 줄임 • IntersectRect : 두 개의 Rect가 교차되었는 지 검사 • UnionRect : 두 Rect를 Union시킴 • PtInRect : 특정좌표 pt가 영역안에 있는 지 검사

  25. 선박스 도형 출력하기 박스 그리기 BOOL RoundRect( HDC hdc, // 디바이스 컨텍스트 핸들 int nLeftRect, // 좌측 x좌표 int nTopRect, // 상단 y좌표 int nRightRect, // 우측 x좌표 int nBottomRect, // 하단 y좌표 int nWidth, // 모서리의 가로측 지름 int nHeight // 모서리의 세로측 지름 );

  26. 선박스 도형 출력하기 박스 그리기 예제 //박스 그리기 Rectangle(hdc,0,0,100,100); //라운드 박스 그리기 RoundRect(hdc,0,0,100,100,20,20);

  27. 선박스 도형 출력하기 다양한 원 그리기 BOOL Ellipse( HDC hdc, // handle to device context int nLeftRect, // 좌측 x좌표 int nTopRect, // 상단 y좌표 int nRightRect, // 우측 x좌표 int nBottomRect // 하단 y좌표 ); BOOL Pie( HDC hdc, // 디비이스 컨텍스 핸들 int nLeftRect, // 좌측 x좌표 int nTopRect, // 상단 y좌표 int nRightRect, // 우측 x좌표 int nBottomRect, //하단 y좌표 int nXRadial1, // 그리기를 시작하는 x지점 int nYRadial1, // 그리기를 시작하는 y지점 int nXRadial2, // 그리기를 종료하는 x지점 int nYRadial2 // 그리기를 종료하는 y지점 );

  28. 선박스 도형 출력하기 다양한 원 그리기 BOOL Chord( HDC hdc, // 디비이스 컨텍스 핸들 int nLeftRect, // 좌측 x좌표 int nTopRect, // 상단 y좌표 int nRightRect, // 우측 x좌표 int nBottomRect, //하단 y좌표 int nXRadial1, // 그리기를 시작하는 x지점 int nYRadial1, // 그리기를 시작하는 y지점 int nXRadial2, // 그리기를 종료하는 x지점 int nYRadial2 // 그리기를 종료하는 y지점 ); BOOL Arc( HDC hdc, // 디바이스 컨텍스 핸들 int nLeftRect, // 좌측 x좌표 int nTopRect, // 상단 y좌표 int nRightRect, // 우측 x좌표 int nBottomRect, // 하단 y좌표 int nXRadial1, // 그리기를 시작하는 x지점 int nYRadial1, // 그리기를 시작하는 y지점 int nXRadial2, // 그리기를 종료하는 x지점 int nYRadial2 // 그리기를 종료하는 y지점 );

  29. 선박스 도형 출력하기

  30. 선박스 도형 출력하기 예제 Ellipse(hdc,0,0,100,100); Arc(hdc,0,0,100,100,50,0,100,50); Chord(hdc,0,0,100,100,50,0,0,50); Pie(hdc,0,0,100,100,50,0,0,50);

  31. 선박스 도형 출력하기 다각형과 폴리라인 BOOL Polyline( HDC hdc, // 디바이스 컨텍스트 핸들 CONST POINT *lppt, // 그릴 좌표 int cPoints // 좌표의 수 ); BOOL Polygon( HDC hdc, // 디바이스 컨텍스트 핸들 CONST POINT *lppt, // 그릴 좌표 int cPoints // 좌표의 수 );

  32. 선박스 도형 출력하기 여러점의 다각형을 그리는 예입니다. POINT pgon[4]={308,120,440,118,380,212,308,120}; Polygon(hdc,pgon,4);

  33. 펜과 브러쉬 HPEN CreatePen( int fnPenStyle, // 펜의 스타일 int nWidth, // 펜의 굵기 COLORREF crColor // 펜의 색 ); HPEN pen; pen=CreatePen(PS_SOLID,1,RGB(255,0,0));

  34. 펜과 브러쉬 HBRUSH CreateSolidBrush( COLORREF crColor // 브러쉬의 색 );

  35. 펜과 브러쉬 case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect(hwnd,&rect); //청색 펜을 만든다. hPen=CreatePen(PS_SOLID,2,RGB(0,0,255)); //적,녹,청 색의 브러쉬를 만든다. hBrushR=CreateSolidBrush(RGB(255,0,0)); hBrushG=CreateSolidBrush(RGB(0,255,0)); hBrushB=CreateSolidBrush(RGB(0,0,255)); //DC에 설정 oldPen=SelectObject(hdc,hPen); oldBrush=SelectObject(hdc,hBrushR); //박스 그리기 Rectangle(hdc,rect.left+10,rect.top+10,rect.right-10,rect.bottom-10); //라운드 박스 그리기 RoundRect(hdc,rect.left+20,rect.top+20,rect.right-20,rect.bottom-20,20,20); SelectObject(hdc,hBrushG);

  36. 펜과 브러쉬 //원 그리기 Ellipse(hdc,rect.left+30,rect.top+30,rect.right-30,rect.bottom-30); //직선 그리기 MoveToEx(hdc,rect.left+10,rect.top+10,&prevpos); LineTo(hdc,rect.right-10,rect.bottom-10); SelectObject(hdc,hBrushB); //베지어 곡선 PolyBezier(hdc,pline,4); //폴리 라인 Polyline(hdc,pline,6); //다각형 Polyline(hdc,pgon,4); SelectObject(hdc,oldPen); SelectObject(hdc,oldBrush); DeleteObject(hPen); DeleteObject(hBrushR); DeleteObject(hBrushG); DeleteObject(hBrushB);

  37. 실습과제 • 모든 가능한 도형들을 색을 넣어서 그리시오.