windows programming 제대로 배우기
DESCRIPTION
Windows Programming 제대로 배우기. Chapter 12. Bitmap Handling. 학습 목표. 비트맵 파일 처리. BitBlt. 비트맵은 아이콘 , 그림 , 사진 등이 어떠한 형식을 가지고 저장된 리소스를 말하며 , 메뉴와는 달리 별도의 파일형태 (bmp) 로 저장 HBITMAP hBitmap; hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));. 비트맵 출력 절차 - PowerPoint PPT PresentationTRANSCRIPT
Windows Programming제대로 배우기
Chapter 12. Bitmap Handling
2
학습 목표
1. 비트맵 파일 처리
3
BitBlt
• 비트맵은 아이콘 , 그림 , 사진 등이 어떠한 형식을 가지고 저장된 리소스를 말하며 , 메뉴와는 달리 별도의 파일형태 (bmp) 로 저장
HBITMAP hBitmap;hBitmap = LoadBitmap(hInst,
MAKEINTRESOURCE(IDB_BITMAP1));
4
• 비트맵 출력 절차– 현재의 화면 DC 와 호환되는 새로운 DC 를
하나 만든다 (MemDC)– 이 MemDC 에 비트맵을 Select 한다– BitBlt 와 같은 함수로 DC 간 고속복사를
수행하여 나타냄
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);
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
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 코드가 필요할 경우에는 상수를 직접 사용해야 한다 .
8
• 아래 표에서 S 는 복사원 (Source), D 는 복사처 (Destination), P
는 패턴 (Pattern, 즉 브러쉬 ) 를 의미한다 .
9
10
11
SDK Temp.txt 에서 소스 템플릿 복사 후 컴파일
12
13
14
15
16
17
18
// 리소스 에디터에서 지정한 이름
19
// Global Handle 받아오기
20
결과화면
21
그림 크기 알아내기• int GetObject(HGDIOBJ hgdiobj, int cbBuffer, L
PVOID lpvObject);
▶hgdiobj : 조사하고자 하는 GDI 오브젝트의 핸들 . 비트맵 , 브러시 , 팬 , 폰트 등의 핸들을 준다 .
▶cbBuffer : 버퍼에 기록할 정보의 크기 . sizeof(lpvObject) 값을 주면 된다 .
▶lpvObject : 오브젝트의 정보를 리턴받을 구조체의 포인터 . 핸들의 타입에 따라 사용되는 구조체가 달라진다 . 이 인수를 NULL 로 주면 필요한 버퍼의 크기를 리턴해 준다 .
22
GetObject(hBitmap, sizeof(BITMAP), &bmp);BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hMemDC, 0, 0, SRCCOPY);
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 코드가 필요할 경우에는 상수를 직접 사용해야 한다 .
24
• 아래 표에서 S 는 복사원 (Source), D 는 복사처 (Destination), P 는 패턴 (P
attern, 즉 브러쉬 ) 을 의미한다 .
25
// 화면 꽉 채우게 출력
26
( 예 ) 이미지의 크기 토글하는프로그램
?
R1
R2
Destination
m_bLargeFlag
m_SrcRect
m_BoundRect
( 원본 크기 )
( 확대 크기 )
27
28
29
30
( 예 ) 특정영역의 확대
31
// 원래 크기로 돌아감
32
Bitmap Animation
• Drawing <- 이전 그림 지운 후
• ……
• Drawing <- 새로운 위치에 다시 그림
33
애니메이션을 위한 프레임 처리
1 2 3 4
32 32 32 32
32
34
35
이미지 합성을 위한 마스킹 기법
// 소스의 원하는 부분을 흑백으로 처리한 패턴을 배경 그림과 AND 연산으로 드로잉 => 배경이미지에 흑색 그림만 그려짐 , 여기에 원하는 그림을 OR 연산으로 그리면 배경과 합성된 이미지 그림 .
36
MemoryDC 를 이용한 BackSurfacing 기법
• 속도 개선을 위한 방법
BackSurface
MemDC
hdc
2. DC 간 블록전송
3. DC 간 블록전송 원하는 소스의 그림을 Select 후
0. 미리 Select 되어 있는 MemDC
37
38
실습
• 새로운 배경파일 로드• 새로운 캐릭터 파일 ( 마스크 BMP, 원본
BMP) 생성• 애니메이션 출력