1 / 38

Windows Programming 제대로 배우기

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

tara-nelson
Télécharger la présentation

Windows Programming 제대로 배우기

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. Windows Programming제대로 배우기 Chapter 12. Bitmap Handling

  2. 학습 목표 • 비트맵 파일 처리

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

  4. 비트맵 출력 절차 • 현재의 화면 DC와 호환되는 새로운 DC를 하나 만든다(MemDC) • 이 MemDC에 비트맵을 Select한다 • BitBlt와 같은 함수로 DC간 고속복사를 수행하여 나타냄

  5. 1. 화면 DC와 호환되는 새로운 DC만듬 화면 DC Mem 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); • 주어진 DC와 호환되는 DC 생성, 이때 ‘호환된다’라는 뜻은 현재의 설정상태(예: 256칼라)와 동일한 속성을 갖는 DC를 생성함을 의미 • 새로 만든 DC에 그림을 선택함, Pen이나 Brush를 선택할 때 사용했던 함수, Bitmap도 GDI Object에 해당 (주의사항 : Pen과 같은 Object 설정할 때처럼 hdc에 선택하는 것이 아니라, 따로 생성된 hMemDC사용) • 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. SDK Temp.txt에서 소스 템플릿 복사 후 컴파일

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

  11. // Global Handle 받아오기

  12. 결과화면

  13. 그림 크기 알아내기 • int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject); ▶hgdiobj : 조사하고자 하는 GDI 오브젝트의 핸들. 비트맵, 브러시, 팬, 폰트 등의 핸들을 준다. ▶cbBuffer : 버퍼에 기록할 정보의 크기. sizeof(lpvObject)값을 주면 된다. ▶lpvObject : 오브젝트의 정보를 리턴받을 구조체의 포인터. 핸들의 타입에 따라 사용되는 구조체가 달라진다. 이 인수를 NULL로 주면 필요한 버퍼의 크기를 리턴해 준다.

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

  15. 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코드가 필요할 경우에는 상수를 직접 사용해야 한다.

  16. 아래 표에서 S는 복사원 (Source), D는 복사처(Destination), P는 패턴(Pattern, 즉 브러쉬)을 의미한다.

  17. // 화면 꽉 채우게 출력

  18. (예) 이미지의 크기 토글하는프로그램 R1 m_SrcRect Destination (원본 크기) ? m_bLargeFlag R2 m_BoundRect (확대 크기)

  19. (예) 특정영역의 확대

  20. // 원래 크기로 돌아감

  21. Bitmap Animation • Drawing <-이전 그림 지운 후 • …… • Drawing <- 새로운 위치에 다시 그림

  22. 애니메이션을 위한 프레임 처리 32 32 32 32 32 1 2 3 4

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

  24. MemoryDC를 이용한 BackSurfacing 기법 • 속도 개선을 위한 방법 BackSurface 2. DC간 블록전송 0.미리 Select되어 있는 MemDC hdc MemDC 원하는 소스의 그림을 Select 후 3. DC간 블록전송

  25. 실습 • 새로운 배경파일 로드 • 새로운 캐릭터 파일 (마스크BMP,원본BMP) 생성 • 애니메이션 출력

More Related