windows programming 제대로 배우기

38
Windows Programming 제제제 제제제 Chapter 12. Bitmap Handling

Upload: tara-nelson

Post on 01-Jan-2016

71 views

Category:

Documents


0 download

DESCRIPTION

Windows Programming 제대로 배우기. Chapter 12. Bitmap Handling. 학습 목표. 비트맵 파일 처리. BitBlt. 비트맵은 아이콘 , 그림 , 사진 등이 어떠한 형식을 가지고 저장된 리소스를 말하며 , 메뉴와는 달리 별도의 파일형태 (bmp) 로 저장 HBITMAP hBitmap; hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));. 비트맵 출력 절차 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Windows Programming 제대로 배우기

Windows Programming제대로 배우기

Chapter 12. Bitmap Handling

Page 2: Windows Programming 제대로 배우기

2

학습 목표

1. 비트맵 파일 처리

Page 3: Windows Programming 제대로 배우기

3

BitBlt

• 비트맵은 아이콘 , 그림 , 사진 등이 어떠한 형식을 가지고 저장된 리소스를 말하며 , 메뉴와는 달리 별도의 파일형태 (bmp) 로 저장

HBITMAP hBitmap;hBitmap = LoadBitmap(hInst,

MAKEINTRESOURCE(IDB_BITMAP1));

Page 4: Windows Programming 제대로 배우기

4

• 비트맵 출력 절차– 현재의 화면 DC 와 호환되는 새로운 DC 를

하나 만든다 (MemDC)– 이 MemDC 에 비트맵을 Select 한다– BitBlt 와 같은 함수로 DC 간 고속복사를

수행하여 나타냄

Page 5: Windows Programming 제대로 배우기

5

화면 DC Mem DC

1. 화면 DC 와 호환되는 새로운 DC 만듬

Bitmap Bitmap

2. Select

3. BitBlt

HDC hMemDC;

hMemDC = CreateCompatibleDC(hdc);

SelectObject(hMemDC, hBitmap);

BitBlt(hdc, 0, 0, 320, 320, hMemDC, 0, 0, SRCCOPY);

Page 6: Windows Programming 제대로 배우기

6

1. hMemDC = CreateCompatibleDC(hdc);2. SelectObject(hMemDC, hBitmap);3. BitBlt(hdc, 0, 0, 320, 320, hMemDC, 0, 0, SRCCOPY);

1. 주어진 DC 와 호환되는 DC 생성 , 이때 ‘호환된다’라는 뜻은 현재의 설정상태 ( 예 : 256 칼라 ) 와 동일한 속성을 갖는 DC 를 생성함을 의미

2. 새로 만든 DC 에 그림을 선택함 , Pen 이나 Brush 를 선택할 때 사용했던 함수 , Bitmap 도 GDI Object 에 해당 ( 주의사항 : Pen 과 같은 Object 설정할 때처럼 hdc 에 선택하는 것이 아니라 , 따로 생성된 hMemDC 사용 )

3. BitBlt 함수는 DC 간 블록 전송을 수행하는 함수이며 , 두 DC 간에 작업이 이루어짐

• 비트맵 출력 시 사용 함수– BitBlt– StretchBlt– PatBlt

Page 7: Windows Programming 제대로 배우기

7

• BOOL BitBlt(HDC hDC,int X,int Y,int nWidth,int nHeignt, HDC hSrcDC,int XSrc,int ySrc,DWORD dwROP);

▶hDC: 비트맵이 복사될 DC ▶X,Y,nWidth,nHeight: 비트맵이 복사될 위치의

좌상단 좌표와 폭 , 넓이 , 이 값은 논리적 좌표값이다 .

▶HSrcDC: 복사될 비트맵을 가지고 있는 DC. 만약 dwROP 가 소스가 필요없는 값이라면 NULL 이 될 수도 있다 .

▶XSrc,YSrc: 복사될 비트맵의 좌측 상단 좌표이며 복사처와 마찬가지로 논리적 좌표값이다 . 이 값이 0 일 경우 전체 비트맵을 복사한다 . 복사원의 폭과 높이는 복사처의 nWidth, nHeight 가 적용된다 .

▶dwROP:ROP 코드 , 즉 브러쉬와 복사원 , 복사처의 비트맵 색상이 논리 연산될 방법을 지정한다 . 모두 256 개의 가능한 값이 있지만 실제로 의미를 갖는 없은 다음 15개이며 매크로 상수가 정의되어 있다 . 이 외의 ROP 코드가 필요할 경우에는 상수를 직접 사용해야 한다 .

Page 8: Windows Programming 제대로 배우기

8

• 아래 표에서 S 는 복사원 (Source), D 는 복사처 (Destination), P

는 패턴 (Pattern, 즉 브러쉬 ) 를 의미한다 .

Page 9: Windows Programming 제대로 배우기

9

Page 10: Windows Programming 제대로 배우기

10

Page 11: Windows Programming 제대로 배우기

11

SDK Temp.txt 에서 소스 템플릿 복사 후 컴파일

Page 12: Windows Programming 제대로 배우기

12

Page 13: Windows Programming 제대로 배우기

13

Page 14: Windows Programming 제대로 배우기

14

Page 15: Windows Programming 제대로 배우기

15

Page 16: Windows Programming 제대로 배우기

16

Page 17: Windows Programming 제대로 배우기

17

Page 18: Windows Programming 제대로 배우기

18

// 리소스 에디터에서 지정한 이름

Page 19: Windows Programming 제대로 배우기

19

// Global Handle 받아오기

Page 20: Windows Programming 제대로 배우기

20

결과화면

Page 21: Windows Programming 제대로 배우기

21

그림 크기 알아내기• int GetObject(HGDIOBJ hgdiobj, int cbBuffer, L

PVOID lpvObject);

▶hgdiobj : 조사하고자 하는 GDI 오브젝트의 핸들 . 비트맵 , 브러시 , 팬 , 폰트 등의 핸들을 준다 .

▶cbBuffer : 버퍼에 기록할 정보의 크기 . sizeof(lpvObject) 값을 주면 된다 .

▶lpvObject : 오브젝트의 정보를 리턴받을 구조체의 포인터 . 핸들의 타입에 따라 사용되는 구조체가 달라진다 . 이 인수를 NULL 로 주면 필요한 버퍼의 크기를 리턴해 준다 .

Page 22: Windows Programming 제대로 배우기

22

GetObject(hBitmap, sizeof(BITMAP), &bmp);BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hMemDC, 0, 0, SRCCOPY);

Page 23: Windows Programming 제대로 배우기

23

StretchBlt• 그림을 크게 늘거나 줄이는데 사용

• BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);

▶hDC: 비트맵이 복사될 DC ▶X,Y,nWidth,nHeight: 비트맵이 복사될 위치의 좌상단 좌표와 폭 , 넓이 , 이

값은 논리적 좌표값이다 . ▶HSrcDC: 복사될 비트맵을 가지고 있는 DC. 만약 dwROP 가 소스가 필요없는

값이라면 NULL 이 될 수도 있다 . ▶nXOriginSrc,nYOriginSrc, nWidthSrc, nHeightSrc: 복사될 비트맵의 좌측 상단

좌표와 크기 . 이 영역의 크기와 복사처의 크기가 다를 경우 비트맵은 복사처의 크기에 맞게 축소되거나 확대된다 .

▶dwROP:ROP 코드 , 즉 브러쉬와 복사원 , 복사처의 비트맵 색상이 논리 연산될 방법을 지정한다 . 모두 256 개의 가능한 값이 있지만 실제로 의미를 갖는 없은 다음 15 개이며 매크로 상수가 정의되어 있다 . 이 외의 ROP 코드가 필요할 경우에는 상수를 직접 사용해야 한다 .

Page 24: Windows Programming 제대로 배우기

24

• 아래 표에서 S 는 복사원 (Source), D 는 복사처 (Destination), P 는 패턴 (P

attern, 즉 브러쉬 ) 을 의미한다 .

Page 25: Windows Programming 제대로 배우기

25

// 화면 꽉 채우게 출력

Page 26: Windows Programming 제대로 배우기

26

( 예 ) 이미지의 크기 토글하는프로그램

?

R1

R2

Destination

m_bLargeFlag

m_SrcRect

m_BoundRect

( 원본 크기 )

( 확대 크기 )

Page 27: Windows Programming 제대로 배우기

27

Page 28: Windows Programming 제대로 배우기

28

Page 29: Windows Programming 제대로 배우기

29

Page 30: Windows Programming 제대로 배우기

30

( 예 ) 특정영역의 확대

Page 31: Windows Programming 제대로 배우기

31

// 원래 크기로 돌아감

Page 32: Windows Programming 제대로 배우기

32

Bitmap Animation

• Drawing <- 이전 그림 지운 후

• ……

• Drawing <- 새로운 위치에 다시 그림

Page 33: Windows Programming 제대로 배우기

33

애니메이션을 위한 프레임 처리

1 2 3 4

32 32 32 32

32

Page 34: Windows Programming 제대로 배우기

34

Page 35: Windows Programming 제대로 배우기

35

이미지 합성을 위한 마스킹 기법

// 소스의 원하는 부분을 흑백으로 처리한 패턴을 배경 그림과 AND 연산으로 드로잉 => 배경이미지에 흑색 그림만 그려짐 , 여기에 원하는 그림을 OR 연산으로 그리면 배경과 합성된 이미지 그림 .

Page 36: Windows Programming 제대로 배우기

36

MemoryDC 를 이용한 BackSurfacing 기법

• 속도 개선을 위한 방법

BackSurface

MemDC

hdc

2. DC 간 블록전송

3. DC 간 블록전송 원하는 소스의 그림을 Select 후

0. 미리 Select 되어 있는 MemDC

Page 37: Windows Programming 제대로 배우기

37

Page 38: Windows Programming 제대로 배우기

38

실습

• 새로운 배경파일 로드• 새로운 캐릭터 파일 ( 마스크 BMP, 원본

BMP) 생성• 애니메이션 출력