윈도우의 화면 출력 원리를 이해한다. CDC 클래스를 이용한 화면 출력 기법을 배운다.

Slides:



Advertisements
Similar presentations
Computer Graphics 1 윈도우 프로그래밍 실습 II 김 창 헌김 창 헌.
Advertisements

CH5 디버그를 해보자 디버그 디버거 : 실행중인 응용 프로그램을 지정한 장소에서 정지하고, 그 시 점에서 변수, 메모리, 콜 스택의 내용을 참조하는것이 가능 Build -> Start Debug -> Go.
지하철 안내 앱 소개 제작자 : 손성준 P.S 이 사진은 내용과 관계없음을 명백히 알립니다.( 솔직히 전기동차라는 공통점이 있긴 하지만 ) 그리고 본인이 촬영하였음을 알립니다.
CH1 개발 효율이 높은 프로그램 구조
미디어 프로그래밍 II 소개.
4. 기본적인 그리기.
2장. 윈도우즈 입출력 1/211 1.
1. 던전 디자인 개요_1 1. ‘던전’ 룬스톤은 던전 한 층에도 여러 개가 존재하며, 각 룬스톤 마다 영향을 미치는 범위가 설정되어 있다. 룬스톤이 영향을 주는 범위에 일정시간 사용자가 위치해 있게 되면 사용자 캐릭터는 ‘유령화’ 되어 버리기 때문에, 사용자는.
Efl을 이용한 타이젠 네이티브 웨어러블 앱 만들기
Visual C++ Programming
Visual C download - Visual Studio Team System 2008 Team Suite (90-days Trial)
Windows Programming Chapter 1. Introduction to SDK
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다.
Lab 10 Guide: 프린터 출력 예제. 한 페이지의 그림 인쇄 (교재 24장, 쪽)
제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
Visual C++ Programming Document/View Architecture 3
5장. 단축키와 비트맵 윈도우 프로그램에는 화면에서 사용자들의 입력을 받아 들이고 출력을 위한 코드 외 부분이 존재한다. 이 부분을 주로 리소스라고 부르고 이들은 주로 화면에 나타난다. 메뉴, 툴바, 비트맵, 단축키, 대화상자 등이 여기에 속한다. 이 부분들은 우리의 프로그램의.
고급 컴퓨터 프로그래밍 팀명:지식인 팀원:홍광수 원대연 이소정.
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express Slide 1 (of 25)
MFC 발전 과정과 주요 특징을 개괄적으로 이해한다.
Department of Digital Contents Sang Il Park
1장. 디지털 영상처리의 개념(3) 임은경 2주차 - 디지털영상처리의개념.
윤 홍 란 MFC 기초 윤 홍 란
Lab 2 Guide: 교재 3장 그래픽 예제 ( 쪽) - 펜과 브러시로 그리기 - 튀는 공
Win32 API Programming 이 계 임.
강사 : 이준근 Win32 API 강사 : 이준근
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
순환&면역 6조 박아름 이명동 최제춘.
태양계 시뮬레이션 팀 명: 복학생 강유진 박지혜.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
구조체 struct 구조체와 함수 구조체의 배열, sizeof 연산자 열거형 enum 형 정의 typedef
스레드의 개념과 동작 원리를 이해한다. MFC 스레드의 두 종류인 작업자 스레드와 UI 스레드 사용법을 익힌다.
제2절 법인세의 계산구조와 세무조정 1. 각 사업연도소득에 대한 법인세 계산구조 회계와 사회 결산서상 당기순이익
Microsoft Visual C++ 제 1편 입문편 5장. 샘플 프로그램의 사용자화
Visual C++ Programming How to draw 3
CH 1. MFC 전체보기 정보통신공학과 안 재 형.
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
Visual C++ Programming Output and File
Visual C++ Programming Common Controls
5장. 마우스와 키보드.
Lecture 3 Graphics with GDI
Chapter 12. 직렬 통신과 무선 프로토콜.
7. 자극과 반응 7-2. 신경계 3. 여러 가지 반응.
12장 파일처리와 매크로 파일 입출력 함수 문자 입출력 함수 라인 입출력 함수 불록 입출력 함수 매크로.
충북대학교 컴퓨터 그래픽스 연구실 3학기 김일수
프로그래밍2 및 실습 C언어 기반의 C++ 2.
캡스톤 물리 음성 인식을 통한 무드 등 지금은 6시 55분 조.
Visual C++ Programming MFC Programming의 이해
날짜: 팀명: TEAM-SIX 발표자: 이기영
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
충북대학교 컴퓨터 그래픽스 연구실 3학기 김일수 작성
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Byte Alignment ㈜ 웰컴정보시스템 김 정 은.
우리나라의 수자원 물 보기를 금같이 우리나라의 수자원 현황 우리나라의 수자원 이용 현황.
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
3장. 제어 메시지 처리하기 1/211 1.
지역의 자연 환경과 인문환경 조사 사회 1학년 1학기 Ⅰ.지역과 사회 탐구>1.지역사회의 지리적 환경(3/6
직장생활 예절 ① - 인사 1.내가 먼저 [인사의 5point] 2.상대방의 눈을 보고 미소지으며 3.상대방에 맞춰서
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
성공적인 입사지원서 작성법 제이비커리어 교육수석 소 은 선.
유체역학 마이크로마노미터의 이론과 공식을 설명하라. 환경공학과 김기복.
Chapter 03. 소켓 주소 구조체 다루기.
8단계 3층을 완성한다 Case 1 Case 2 Case 3 Case 4
DirectX 9 Ch1. Direct3D 초기화.
MFC 응용 프로그램 구조 두 개의 윈도우로 구성된 일반적인 MFC 프로그램 프레임 윈도우
윈도우 운영체제와 윈도우 응용 프로그램의 특징 SDK 응용 프로그램 MFC 응용 프로그램
배열.
MFC 기초 윈도우 응용프로그램 개발 간략한 역사 Microsoft Foundation Classes
Presentation transcript:

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

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

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

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

GDI와 디바이스 컨텍스트 (4/5) 디바이스 컨텍스트(DC, Device Context) 윈도우 응용 프로그램의 출력 과정 멀티태스킹(멀티스레딩) GUI 환경에서 발생할 수 있는 여러 상황을 고려한 출력 가능 윈도우 응용 프로그램의 출력 과정 출력하기 전에 윈도우 운영체제에게 디바이스 컨텍스트를 요청한다. 운영체제의 GDI는 내부적으로 디바이스 컨텍스트를 만든 후 디바이스 컨텍스트 핸들(HDC 타입, 32비트 포인터)을 해당 프로그램에게 돌려준다.

GDI와 디바이스 컨텍스트 (5/5) 윈도우 응용 프로그램의 출력 과정 (cont'd) 응용 프로그램은 자신이 받은 핸들을, 출력 관련 API 함수를 호출할 때 사용한다. 출력 관련 API 함수를 호출하면 GDI가 이를 처리한다. GDI는 해당 프로그램이 넘겨준 디바이스 컨텍스트 핸들로 내부 데이터를 참조하여 다양한 상황을 고려해서 출력한다. 응용 프로그램 디바이스 컨텍스트 GDI 장치 드라이버 출력 장치 (화면, 프린터 등)

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

무효 영역 (2/3) 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)); }

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

출력 방법 비교 SDK MFC 윈도우 운영체제에게 디바이스 컨텍스트를 요청한다. 운영체제로부터 받은 디바이스 컨텍스트 핸들을 사용하여 출력을 한다. 운영체제에게 디바이스 컨텍스트 사용이 끝났음을 알린다. MFC 디바이스 컨텍스트 객체를 생성한다. 객체의 멤버 함수를 호출하여 출력한다.

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

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

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

CWindowDC 클래스 CWindowDC 사용 방법 원점 위치 CPaintDC, CClientDC 클래스와 동일

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

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

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

그리기 함수 (3/3) 도형 그리기 사각형에 내접하는 타원을 그린다. Ellipse() 사각형을 그린다. Rectangle() 기능 이름

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

매핑 모드  +x 매핑 모드 단위 x축 y축 MM_TEXT 1 픽셀  +y MM_LOMETRIC 0.1 mm  -y MM_HIMETRIC 0.01 mm MM_LOENGLISH 0.01 인치 MM_HIENGLISH 0.001 인치 MM_TWIPS 1/1440 인치 MM_ISOTROPIC 사용자 정의(가로, 세로 길이 동일) 사용자 정의 MM_ANISOTROPIC

좌표 변환 (1/2) 스크린 좌표와 클라이언트 좌표 스크린 좌표의 원점 클라이언트 좌표의 원점

좌표 변환 (2/2) 좌표 변환 함수 장치 좌표 클라이언트 좌표 스크린 좌표 논리 좌표 ScreenToClient ClientToScreen DPtoLP LPtoDP

속성 함수 속성 초기값 텍스트 색상 검정색 배경 색상 흰색 배경 모드 OPAQUE 매핑 모드 MM_TEXT 그리기 모드 R2_COPYPEN 현재 위치 (0, 0) 펜 BLACK_PEN 브러시 WHITE_BRUSH 폰트 SYSTEM_FONT 비트맵 없음 팔레트 영역 속성을 얻는 함수 GetTextColor() GetBkColor() GetBkMode() GetMapMode() GetROP2() GetCurrentPosition() SelectObject() SelectPalette() 속성을 변경하는 함수 SetTextColor() SetBkColor() SetBkMode() SetMapMode() SetROP2() MoveTo()

그리기 모드 그리기 모드 연산 R2_NOP D = D R2_NOT D = ~D R2_BLACK D = BLACK R2_WHITE D = WHITE R2_COPYPEN D = S R2_NOTCOPYPEN D = ~S R2_MERGEPENNOT D = ~D | S R2_MASKPENNOT D = ~D & S R2_MERGENOTPEN D = ~S | D R2_MASKNOTPEN D = ~S & D R2_MERGEPEN D = D | S R2_NOTMERGEPEN D = ~(D | S) R2_MASKPEN D = D & S R2_NOTMASKPEN D = ~(D & S) R2_XORPEN D = S ^ D R2_NOTXORPEN D = ~(S ^ D)

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

GDI 객체 (2/3) 클래스 계층도

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

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

펜 (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);

브러시 (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);

브러시 (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); CPaintDC dc(this); CBrush brush(RGB(255, 0, 0)); dc.SelectObject(&brush); dc.Ellipse(100, 100, 200, 200);

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

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

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

비트맵 (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;

비트맵 (2/5) 비트맵 정보 출력 CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); BITMAP bmpinfo; bitmap.GetBitmap(&bmpinfo); TRACE("가로 = %d, 세로 = %d\n", bmpinfo.bmWidth, bmpinfo.bmHeight);

비트맵 (3/5) 비트맵 출력 절차 CDC::CreateCompatibleDC() 함수를 이용하여 메모리 디바이스 컨텍스트를 만든다. CDC::SelectObject() 함수를 이용하여 비트맵을 메모리 디바이스 컨텍스트에 선택한다. CDC::BitBlt() 또는 CDC::StretchBlt() 함수를 이용하여 화면에 출력한다.

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

비트맵 (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