1 / 41

Visual C++ Programming How to draw?

Visual C++ Programming How to draw?. Department of Digital Contents Sang Il Park. Outline. Review How to draw with MFC. The simplest MFC application. VC++ Framework. CFrameWnd. CChildView. CDocument. 윈도우의 프레임 ( 틀 ) 을 관리. 데이터를 보여주는 윈도우. 데이터를 저장 , 처리 ( 눈에 안보임 ).

Download Presentation

Visual C++ Programming How to draw?

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. Visual C++ ProgrammingHow to draw? Department of Digital Contents Sang Il Park

  2. Outline • Review • How to draw with MFC

  3. The simplest MFC application

  4. VC++ Framework CFrameWnd CChildView CDocument 윈도우의 프레임(틀)을 관리 데이터를 보여주는 윈도우 데이터를 저장, 처리(눈에 안보임) CWinApp : 위의 세 오브젝트를 묶어 주고, 프로그램을 구동 시킴(눈에 안보임) 메시지루프를 돌림

  5. 프로그램 내부 구조 theApp (CSimpleApp : CWinApp) m_pMainFrame (CMainFrame : CFrameWnd) m_wndView (CChildView : CWnd)

  6. Hungarian Notation • 변수의 이름을 짓는 방법: • 의미를 알 수 있게 • 일관되게 • Hungarian Notation: • Microsoft에서 따르는 변수 이름 작명법

  7. Hungarian Notation

  8. 데이터 타입 정의 BOOL 또는 BOOLEAN TRUE 또는 FALSE BYTE, WORD, DWORD, LONG 8비트, 16비트, 32비트, 32비트(모두 unsigned) U* unsigned * 예) UCHAR, UINT, ULONG, ... HANDLE 32비트 핸들 H* *을 가리키는 핸들 예) HBITMAP(비트맵), HBRUSH(브러시), HCURSOR(커서), HDC(디바이스 컨텍스트), HFONT(폰트), HICON(아이콘), HINSTANCE(인스턴스), HMENU(메뉴), HPEN(펜), HWND(윈도우) 데이터 타입들 • API 데이터 타입 - 기본형

  9. 데이터 타입 정의 P* = LP* * 에 대한 포인터 예1) PBOOL, PBYTE, PLONG, ... 예2) LPBOOL, LPBYTE, LPLONG, ... (L)PSTR, (L)PCSTR ANSI 문자열 (L)PTSTR, (L)PCTSTR ANSI 또는 유니코드 문자열 COLORREF 32비트 RGB (red, green, blue 각각 8비트) 색상값 데이터 타입들 • API 데이터 타입 - 기본형 (cont’d)

  10. 응용 프로그램 실행순서 CSimpleApp theApp; WinMain() // MFC 내부에 숨겨짐 { theApp.InitInstance(); // 초기화 theApp.Run(); // 메시지 루프 theApp.ExitInstance(); // 종료 }

  11. How to draw with MFC

  12. 도스 시절 게임하기… • In 1980s, before the birth of the “windows 95” • MS-DOS (Disk Operating System) • Graphics Card: CGA(4색)/EGA(16색)/VGA(256색) 도스는 그래픽스 카드와 상관이 없다? Device-Independent 개념의 시작 게임회사가 그래픽스 카드 드라이버를 각각 제공 CGA CGA용 게임

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

  14. GDI와 디바이스 컨텍스트 (2/5) • GDI(Graphics Device Interface) • 운영체제의 하위 시스템 중 하나 • 응용 프로그램의 요청을 받아서 실제 출력 장치에 대한 출력을 담당 응용 프로그램 GDI 출력 장치 (화면, 프린터 등) 장치 독립적 장치 의존적

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

  16. GDI와 디바이스 컨텍스트 (4/5) • 디바이스 컨텍스트(DC, Device Context) • GDI가 생성하고 관리하는 데이터 구조체 • 멀티태스킹(멀티스레딩) GUI 환경에서 발생할 수 있는 여러 상황을 고려한 출력 가능

  17. GDI와 디바이스 컨텍스트 (4/5) • 윈도우 응용 프로그램의 출력 과정 • 응용 프로그램: 디바이스 컨텍스트 요청 • 운영체제(GDI): 디바이스 컨텍스트 생성 및 핸들(포인터) 제공 • 응용프로그램: 디바이스 컨텍스트에 그림 그리기 • 운영체제(GDI): 그림 그리는 상황 검토 후 출력

  18. 응용 프로그램 디바이스 컨텍스트 GDI 장치 드라이버 출력 장치 (화면, 프린터 등) GDI와 디바이스 컨텍스트 (5/5) • 윈도우 응용 프로그램의 출력 과정 (cont'd)

  19. 그림 그리는 부분은 어디에? • WM_PAINT 메시지 핸들러 (OnPaint) 함수 속 • 아무데나…

  20. 화면 그리기 연습 • Project 생성 • Single Document • No Document/View Architecture Support • CChildView의 WM_PAINT 메시지 핸들러 수정 void CChildView::OnPaint() { CPaintDC dc(this); dc.Rectangle(50,50,250,250); dc.Ellipse(100,100,200,200); }

  21. 화면 그리기 연습

  22. WM_PAINT?? • WM: Windows Message • MFC에서 제공하는 기본 메시지 • 화면 내 창이나 마우스, 키보드과 관련된 메시지 • WM_PAINT • 화면을 다시 그릴 필요가 있다고 판단될 경우 발생되는 메시지 • “무효영역(invalid region)이 생겼다!”

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

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

  25. 무효 영역 (3/3) • WM_PAINT 메시지 처리 • API를 사용할 때 • MFC를 사용할 때 hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 100, 100, “Hello, MFC”); EndPaint(hwnd, &ps); return 0; void CMainFrame::OnPaint() { CPaintDC dc(this); dc.TextOut(100, 100, “Hello, MFC”); }

  26. 출력 방법 비교 • SDK • 윈도우 운영체제에게 디바이스 컨텍스트를 요청 • BeginPaint(hwnd, &ps); • 얻어낸 디바이스 컨텍스트 핸들을 사용하여 출력 • TextOut(hdc, 100, 100, “Hello, MFC”); • 운영체제에게 디바이스 컨텍스트 사용이 끝났음을 알림 • EndPaint(hwnd, &ps); • MFC • 디바이스 컨텍스트 객체 생성 (this pointer 이용) • CPaintDC dc(this) • 객체의 멤버 함수를 호출하여 출력 • dc.TextOut( … )

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

  28. 클래스 계층도

  29. CPaintDC 클래스 • 오로지 WM__PAINT 메시지 핸들러에서만 사용 • OnPaint() • CPaintDC 사용 예 void CChildView::OnPaint() { CPaintDC dc(this); // ... }

  30. 이름 기능 Rectangle() 사각형을 그린다. Ellipse() 사각형에 내접하는 타원을 그린다. DC의 그리기 관련 맴버 함수 • 도형 그리기 (x1, y1) dc.Rectangle (x1, y1, x2, y2); dc.Ellipse (x1, y1, x2, y2); (x2, y2)

  31. CPaintDC 사용 연습 • 다음과 같은 그림을 그려보자

  32. CClientDC 클래스 • WM_PAINT 메시지 핸들러 이외의 부분에서 사용 • CClientDC 사용 예 void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); // ... }

  33. CClientDC 사용 연습 • 마우스 버튼이 눌렸을 때 그림을 그려보자! • 마우스 버튼이 눌리는 메시지 핸들러 추가 • CClientDC 객체 생성 • 생성된 DC객체를 이용하여 그리기

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

  35. CWindowDC 사용 연습 • 다음과 같은 그림을 그려보자

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

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

  38. COLORREF 색을 저장하는 변수 32 bit DWORD: 0x00rrggbb 형식 여러가지 편한 매크로: COLORREF color = RGB(r,g,b); r = GetRValue (color); g = GetGValue (color); b = GetBValue (color); 38

  39. 이름 기능 MoveTo() 현재 위치를 옮긴다. LineTo() 현재 위치로부터 특정 위치까지 선을 그린 후 현재 위치를 갱신한다. 그리기 함수 (2/3) • 선 그리기 (x1,y1) dc.MoveTo(x1,y1); dc.LineTo(x2,y2); (x2,y2)

  40. 이름 기능 Rectangle() 사각형을 그린다. Ellipse() 사각형에 내접하는 타원을 그린다. 그리기 함수 (3/3) • 도형 그리기 (x1, y1) dc.Rectangle (x1, y1, x2, y2); dc.Ellipse (x1, y1, x2, y2); (x2, y2) 40

  41. 이름 기능 TextOut() 특정 위치에 문자열을 출력한다. DrawText() 사각형을 기준으로 문자열을 출력한다. SetTextColor() 문자의 색을 바꾼다. SetBkColor() 문자의 배경색을 바꾼다. SetTextAlign() 기준 위치에 대한 문자열의 정렬 방식을 정한다. 텍스트 함수 • 텍스트 출력 함수 dc.SetTextColor(RGB(255,0,0)); dc.SetBkColor(RGB(0,255,0)); dc.SetTextAlign(TA_CENTER); dc.TextOut(300,200,“Sejong University”);

More Related